Yeni apt komutu için bash tamamlamayı etkinleştirebilir miyim?


20

Yeni apt14.04 beri Ubuntu mevcut komut, aralarında işlevsellik gerçekten yararlı kavşak gibi görünüyor apt-getve apt-cacheancak mevcut sürümü bash-completionbir yapar hangisi ... bu konuda bilmiyor sürü kullanımına zor.

aptKomutun kullanımını kolaylaştırmak için bu işlevi Bash'e eklemenin hızlı bir yolu var mı ?


Yanıtlar:


26

Bu, bash-completepaketteki bir ihmaldir , değil apt. Sadece bir tamamlama henüz yokmuş gibi görünüyor, bu yüzden aptkomut için elimden geleni yaptım (şimdiye kadar var olan en iyi belgelenmiş komut değil!)

Aşağıdakiler mevcut apt-gettamamlamadan bir uyarlamadır (elemanlar elimden alınmış ve bitlerin bitimi ile eklenmiş apt-cache). Çalıştırın sudoedit /usr/share/bash-completion/completions/aptve aşağıya yapıştırın:

# 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

Sonra source ~/.bashrctamamlamayı yüklemek için koş . O zaman apt show firef+ Tabtamamlanmalıdır.

Bu size artık var olmayan seçenekler sunabilir. Ben ana komutlar (zaman içinde değişebilir olan) çivilenmiş ettik ama en azından ortak komutlarla yardımcı olacağız düşünüyorum: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Açıkçası, bir bash tamamlayıcıyı sürdüren kişi yukarıdakileri kaldırmak istiyorsa, GPL kapsamında kabul edilirsiniz (yine de bir keresinde yeni baştan başlamak üzere cazip geldiğim aptbelgelenmiştir!)


8
Bir hata açın ve bunu bir yama olarak gönderin!
Jorge Castro

Bu cevabı nasıl kullanacağınız hakkında bir fikriniz var zshmı?
Exeleration-G

Launchpad'de bu "ben de" nerede?
Mateo

1

Orijinal bas-tamamlamayı neden kullanmıyorsunuz ?

Bu betiği dene. Üzerinde bash tamamlama indirip yükleyecektir ~/tmp/bash-completion.

#!/bin/bash
echo -en "\e]2;Updating bash completion...\a"

katalog="~/tmp/bash-completion"

if [ ! -d "$katalog" ]; then
   mkdir -p $katalog
   cd $katalog
   cd ..
   git clone git://git.debian.org/git/bash-completion/bash-completion.git
   cd $katalog
   autoreconf -i
   ./configure
   make
   sudo make install
else
   cd $katalog
   if [ `git log --pretty=%H ...refs/heads/master^` != `git ls-remote origin -h refs/heads/master |cut -f1` ]; then
      git pull
      autoreconf -i
      ./configure
      make
      sudo make install
   else
      echo "Bash-completion is already up to date!"
   fi
fi

Dosyaya . ~/tmp/bash-completion/bash_completion.shkoyulabilen komutla kullanmaya başlarsınız ~/.bashrc, ya da - daha iyisi - /etc/profile.d/dizindeki bir dosyaya bağlayın . Orijinal bas-tamamlamayı kaldırın, böylece ikisini de aynı anda yüklemeyeceksiniz.



1
@Oli Eh, sanırım onlar. Orada dosyalardır aptitude, apt-getve apt-cache. Tam olarak bitirmekle ne demek istiyorsun ?
Adam Ryczkowski

3
Açılış soruma göre, aptTrusty'de yepyeni (ish) bir komuttur. Bazı apt-get, bazıları apt-cache var ... Hepsi bir yerde biraz fazla güzelleşmek.
Oli

@Oli Oh, haklısın! Ben bilmiyordum. Ve - bash-tamamlama şimdiye kadar kutudan desteklemiyor. Neyse ki, bir eklenti yazmak bu kadar zor olmaz, bu yüzden yakında bekleyebilirsiniz. Muhtemelen, sen benim senaryomu kullanarak, onu kullanabilecek ilk kişilerden biri olabilirsin.
Adam Ryczkowski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.