Tôi có thể bật hoàn thành bash cho lệnh apt mới không?


20

Lệnh mới apt, có mặt trong Ubuntu kể từ ngày 14.04, dường như là một giao điểm thực sự hữu ích của chức năng giữa apt-getapt-cachenhưng phiên bản hiện tại bash-completionkhông biết về nó ... Điều này làm cho nó khó sử dụng hơn rất nhiều .

Có cách nào nhanh chóng để thêm chức năng này vào Bash để làm cho aptlệnh dễ sử dụng không?


1
Việc gắn thẻ của câu hỏi này được bắt đầu thảo luận về meta .
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


26

Đây là một thiếu sót trong bash-completegói, không apt. Có vẻ như sự hoàn thành chưa tồn tại, vì vậy tôi đã loại bỏ những gì tôi có thể cho aptlệnh (đó không phải là lệnh được ghi chép tốt nhất từng tồn tại!)

Sau đây là một điều chỉnh từ sự apt-gethoàn thành hiện có (với các phần tử được loại bỏ và các bit được thêm vào từ apt-cachesự hoàn thành của nó). Chạy sudoedit /usr/share/bash-completion/completions/aptvà dán như sau:

# 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

Sau đó chạy source ~/.bashrcđể tải hoàn thành. Sau đó apt show firef+ Tabnên hoàn thành.

Điều này có thể cung cấp cho bạn các tùy chọn không còn tồn tại nữa. Tôi nghĩ rằng tôi đã đóng đinh các lệnh chính (có thể thay đổi theo thời gian) nhưng ít nhất nó sẽ giúp bạn với các lệnh phổ biến : list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Rõ ràng, nếu một người duy trì hoàn thành bash muốn kiếm được những thứ ở trên, bạn sẽ được chào đón theo GPL (mặc dù tôi rất muốn bắt đầu lại từ khi mới aptđược ghi lại!)


8
Mở một lỗi và gửi nó như là một bản vá!
Jorge Castro

Bạn có bất cứ ý tưởng về cách sử dụng câu trả lời này với zsh?
Tăng tốc-G

Có từ nào để "tôi cũng vậy" này trên launchpad không?
Mateo

1

Tại sao không sử dụng bash-hoàn thành ban đầu ?

Hãy thử kịch bản này. Nó sẽ tải xuống và cài đặt bash-hoàn thành trên ~/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

Bạn bắt đầu sử dụng nó với lệnh . ~/tmp/bash-completion/bash_completion.sh, có thể được đưa vào ~/.bashrctệp, hoặc - tốt hơn nữa - symlink nó vào một số tệp trong /etc/profile.d/thư mục. Gỡ cài đặt hoàn thành bash ban đầu, do đó bạn sẽ không tải cả hai cùng một lúc.


Tôi đã không nghĩ về điều này nhưng dường như họ cũng chưa hoàn thành apt
Oli

1
@Oli Vâng, tôi đoán họ làm. Có tập tin aptitude, apt-getapt-cache. Chính xác những gì bạn có nghĩa là hoàn thành apt ?
Adam Ryczkowski

3
Theo câu hỏi mở đầu của tôi, aptlà một lệnh (ish) hoàn toàn mới trong Trusty. Nó có một số apt-get, một số apt-cache ... Tất cả đều có thêm một chút khởi sắc ở một nơi.
Oli

@Oli ơi, bạn nói đúng! Tôi không biết về nó. Và - bash-hoàn thành không hỗ trợ nó ra khỏi hộp cho đến nay. May mắn là sẽ không khó để viết một plugin, vì vậy bạn có thể mong đợi một plugin sớm. Rất có thể, bằng cách sử dụng kịch bản của tôi, bạn sẽ là người đầu tiên, người có thể sử dụng nó.
Adam Ryczkowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.