Howto: APT mit bash-completion

Im Zuge der Veröffentlichung von APT 1.1 hatte ich mir vorgenommen, nicht mehr das doch recht umständliche apt-get (mit Kosorten wie apt-cache) zu nutzen sondern stattdessen komplett auf die neue, deutlich einfacher Syntax umzustellen. Der Versuch lief bis dato auch recht gut, wobei ich aber von Anfang an die automatische Vervollständigung von Befehlen und Optionen vermisst habe. Oder kurz gesagt: bash-completion ging nicht.

Die Suche im Netz nach „apt“ und „bash-completion“ in verschiedenen Kombinationen war zwar ergiebig, aber nicht gerade hilfreich. Einzig auf askubuntu.com bin ich über ein kurzes Script gestolpert, das sowie dessen Einrichtung ich euch nicht vorenthalten möchte:

  1. Datei mit root Rechten anlegen/öffnen:
    # vim /usr/share/bash-completion/completions/apt
  2. Folgenden bash code kopieren und dort einfügen:
    # Debian apt(8) completion                             -*- shell-script -*-
    
    _apt()
    {
        local cur prev words cword
        _init_completion || return
    
        local special i
        for (( i=0; i < ${#words[@]}-1; i++ )); do if [[ ${words[i]} == @(list|search|show|update|install|remove|upgrade|full-upgrade|edit-sources|dist-upgrade|purge) ]]; then special=${words[i]} fi done if [[ -n $special ]]; then case $special in remove|purge) if [[ -f /etc/debian_version ]]; then # Debian system COMPREPLY=( $( \ _xfunc dpkg _comp_dpkg_installed_packages $cur ) ) else # assume RPM based _xfunc rpm _rpm_installed_packages fi return 0 ;; *) COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" \ 2> /dev/null ) )
                    return 0
                    ;;
            esac
        fi
    
        case $prev in
            -c|--config-file)
                 _filedir
                 return 0
                 ;;
            -t|--target-release|--default-release)
                 COMPREPLY=( $( apt-cache policy | \
                     command grep "release.o=Debian,a=$cur" | \
                     sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2> /dev/null) )
                 return 0
                 ;;
        esac
    
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '-d -f -h -v -m -q -s -y -u -t -b -c -o
                --download-only --fix-broken --help --version --ignore-missing
                --fix-missing --no-download --quiet --simulate --just-print
                --dry-run --recon --no-act --yes --assume-yes --show-upgraded
                --only-source --compile --build --ignore-hold --target-release
                --no-upgrade --force-yes --print-uris --purge --reinstall
                --list-cleanup --default-release --trivial-only --no-remove
                --diff-only --no-install-recommends --tar-only --config-file
                --option --auto-remove' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'list search show update install 
                remove upgrade full-upgrade edit-sources dist-upgrade 
                purge' -- "$cur" ) )
        fi
    
        return 0
    } &&
    complete -F _apt apt
    
    # ex: ts=4 sw=4 et filetype=sh
  3. Speichern und abschließend als normaler Nutzer die .bashrc neu einlesen:
    $ source .bashrc

Fertig! Jetzt habt ihr die Vervollständigung für folgende APT Optionen: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge

(Quelle, Code lizenziert unter GPL)