當前位置:
首頁 > 知識 > 如何編寫 bash completion script

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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ImportNew 的精彩文章:

通向架構師的道路(第十八天)萬能框架 Spring ( 一 )(下)

TAG:ImportNew |