Linux下超強的命令補全工具bash-completion
編寫 Bash 補全腳本
參考URL: https://kodango.com/bash-competion-programming
在使用bash命令行時,在提示符下輸入某個命令的前面幾個字符,然後按下TAB鍵,就會列出以這幾個字符開頭的命令供我們選擇。
自動補全這個功能是Bash自帶的,但一般我們會安裝bash-completion包來得到更好的補全效果,這個包提供了一些現成的命令補全腳本,一些基礎的函數方便編寫補全腳本,還有一個基本的配置腳本。
安裝
yum install -y bash-completion
編寫自動補全腳本
大致原理,一般會有一個名爲bash_completion的腳本,這個腳本會在shell初始化時加載。如對於RHEL系統來說,這個腳本位於/etc/bash_completion,而該腳本會由/etc/profile.d/bash_completion.sh中導入
在bash_completion腳本中會加載/etc/bash_completion.d下面的補全腳本:
if [[ $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR && \
-d $BASH_COMPLETION_DIR && -r $BASH_COMPLETION_DIR && \
-x $BASH_COMPLETION_DIR ]]; then
for i in $(LC_ALL=C command ls "$BASH_COMPLETION_DIR"); do
i=$BASH_COMPLETION_DIR/$i
[[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)|Makefile*) \
&& -f $i && -r $i ]] && . "$i"
done
fi
unset i
補全腳本的名稱一般就是命令名,這樣比較容易查找:
cd /etc/bash_completion.d
[root@VM_0_14_centos bash_completion.d]# ls
git iprutils redefine_filedir scl.bash yum-utils.bash
內置補全命令
Bash內置有兩個補全命令,分別是compgen和complete。compgen命令根據不同的參數,生成匹配單詞的候選補全列表,例如:
[root@VM_0_14_centos bash_completion.d]# compgen -W 'hi hello how world' h
hi
hello
how
compgen最常用的選項是-W,通過-W參數指定空格分隔的單詞列表。h即我們在命令行當前鍵入的單詞,執行完後會輸出候選的匹配列表,這裏是以h開頭的所有單詞。
complete命令的參數有點類似compgen,不過它的作用是說明命令如何進行補全,例如同樣使用-W參數指定候選的單詞列表:
我們還可以通過-F參數指定一個補全函數:
$ complete -F _foo foo
現在鍵入foo命令後,會調用_foo函數來生成補全的列表,完成補全的功能,這一點正是補全腳本實現的關鍵所在。
demo:
#!/usr/bin/env bash
_cli_bash_autocomplete() {
local cur opts base;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-completion );
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) );
return 0;
};
complete -F _cli_bash_autocomplete lotus
一般補全函數(這裏_cli_bash_autocomplete)都會定義以下兩個變量
cur 其中cur表示當前光標下的單詞
opts 其中opts表示選項
初始化相應的變量後,我們需要定義補全行爲,即輸入什麼的情況下補全什麼內容。