歡迎光臨
每天分享高質量文章

如何編寫 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技能

贊(0)

分享創造快樂