如何編寫 bash completion script
(點擊
上方公眾號
,可快速關注)
來源:暗無天日,
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技能
※通向架構師的道路(第十八天)萬能框架 Spring ( 一 )(下)
TAG:ImportNew |