Bash
如何獲得命令別名的 bash 補全?
我希望在我的命令行別名上獲得製表符補全,例如,假設我定義了以下別名:
alias apt-inst='sudo aptitude install'
當我按 Tab 鍵時,有沒有辦法獲得 aptitude 提供的補全?即,當我編寫“sudo aptitude install gnumer”並點擊選項卡時,aptitude 會將其完成為 gnumeric,或者如果存在不確定性,則會列出所有以 gnumer 開頭的可用軟體包。如果我使用我的別名來做,什麼都沒有——沒有完成。
在 Ubuntu 論壇上有一個很棒的主題。Ole J 提出了以下別名補全定義函式:
function make-completion-wrapper () { local function_name="$2" local arg_count=$(($#-3)) local comp_function_name="$1" shift 2 local function=" function $function_name { ((COMP_CWORD+=$arg_count)) COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} ) "$comp_function_name" return 0 }" eval "$function" echo $function_name echo "$function" }
使用它為您的別名定義一個完成函式,然後將該函式指定為別名的完成者:
make-completion-wrapper _apt_get _apt_get_install apt-get install complete -F _apt_get_install apt-inst
我更喜歡使用別名來向現有程序添加始終使用的參數。例如,對於
grep
,我總是想跳過設備和二進製文件,所以我為grep
. 為了添加新的命令,例如grepbin
,我在我的~/bin
文件夾中使用了一個 shell 腳本。如果該文件夾在您的路徑中,它將自動完成。
試試complete-alias,它正好解決了這個問題。(免責聲明:我是作者
complete_alias
)安裝後,您可以使用一個通用函式來完成許多這樣的別名:
complete -F _complete_alias <myalias1> complete -F _complete_alias <myalias2> complete -F _complete_alias <myalias3>
您可能希望通過或類似
complete_alias
方式在每個 bash 實例中獲取文件。.bash_profile
安裝
mkdir ~/.bash_completion.d curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \ > ~/.bash_completion.d/complete_alias
應用
source ~/.bash_completion.d/complete_alias alias container=docker\ container complete -F _complete_alias container
container
現在可以由原始_docker()
完成處理程序自動完成;$ container l<Tab> logs ls $ container s<Tab> start stats stop