(點選上方公眾號,可快速關註)
來源:暗無天日,
lujun9972.github.io/blog/2018/03/13/如何編寫bash-completion-script/
靜態補全
建立靜態補全很簡單,只需要使用 complete 的 -W (wordlist) 選項為指令碼註冊補全的單詞串列就行了。
比如,假設有一個 myscript 指令碼,可以接引數 him,her,me,you, 那麼我們可以執行:
complete -W “him her me you” myscript
這樣輸入 myscript 後按兩下TAB,就會列出所有可能的引數了:
[lujun9972@T520 .spacemacs.d]$ myscript
her him me you
甚至,當你輸入首字母后再按 TAB,bash會自動篩選出以首字母開頭的引數
[lujun9972@T520 .spacemacs.d]$ myscript h
her him
除了 -W 之外, complete 還有很多其他選項,比如可以使用
-A alias / -a
列出別名
-A directory / -d
列出目錄
-A command / -c
列出命令
-A file / -f
列出檔案
-A service / -s
列出服務名稱
-A signal
列出訊號名稱
-A user / -u
列出使用者名稱
-A group / -g
列出組名
-A variable / -v
列出shell變數
詳細的說明可以看這裡
https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html#Programmable-Completion-Builtins
動態補全
動態補全能夠根據使用者的環境動態的生成補全的內容。 當出發動態補全時,bash會在當前shell中執行一個補全函式,然後從變數 COMPREPLY 中讀取補全的內容。
在這個補全函式中,我們可以透過幾個變數來獲取當前使用者輸入命令的環境:
COMP_WORDS
一個陣列,包含了程式名稱和已經輸入的引數
COMP_CWORD
這是一個指向COMP_WORDS陣列的索引,指明瞭當前游標所在的位置(從0開始)
COMP_LINE
當前命令列的內容
compgen命令
compgen是一款內建命令,它與 complete 命令類似,但可以根據已經輸入的內容對補全內容進行過濾,比如
compgen -W “him her me you” h
會輸出結果:
him
her
該命令常在動態補全的補全函式中使用
註冊動態補全函式
要為命令註冊動態補全函式,則需要使用 completion 的 -F 函式 引數:
completion -F 補全函式 程式名稱
舉個例子
比如,我想為 myscript 增加一個補全,這個補全的邏輯是:
-
第一個引數可以是 -f 或 -d
-
第二個引數補全的內容由第一個引數的值來決定,如果第一個引數為 -f 則補全檔案名,如果第一個引數為 -d 則補全目錄名。
那麼我們可以這麼做:
# 首先,定義一個補全函式
function _myscript_completion()
{
if [[ “${COMP_CWORD}” == “1” ]];then
# 若補全的是第一個引數,則可以是 -f 或 -d
COMPREPLY=($(compgen -W “-f -d” ${COMP_WORDS[${COMP_CWORD}]}))
elif [[ “${COMP_WORDS[1]}” == “-f” ]];then
COMPREPLY=($(compgen -f ${COMP_WORDS[${COMP_CWORD}]}))
elif [[ “${COMP_WORDS[1]}” == “-d” ]];then
COMPREPLY=($(compgen -d ${COMP_WORDS[${COMP_CWORD}]}))
fi
}
# 註冊補全函式
complete -F _myscript_completion myscript
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能