Linux下命令補全工具bash-completion

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表示選項

初始化相應的變量後,我們需要定義補全行爲,即輸入什麼的情況下補全什麼內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章