2011-04-06 97 views
85

我最近在shell中花費了很多時間,我想知道標籤自動完成是如何工作的。它背後的機制是什麼? bash如何知道每個目錄的內容?bash選項卡完成如何工作?

+2

您可能想要檢查'/ etc/bash_completion'(至少,這是Debian中很多魔術的地方)。 – Wrikken 2011-04-06 18:18:12

+1

@Wrikken:這是bash_completion,它依賴於製表符完成,但不完全如此。 – 2011-04-06 18:35:50

+2

關於* nix stackexchange還有幾個問題,包括:http://unix.stackexchange.com/questions/4738/an-easy-bash-completion-tutorial http://unix.stackexchange.com/questions/1800/custom-autocomplete http://unix.stackexchange.com/questions/12356/how-does-tab-auto-complete-find-options-to-complete以及SU上的至少一個:http://superuser.com/問題/ 289539 /定製的bash標籤完成 – Cascabel 2012-02-15 02:20:12

回答

81

有兩個部分來自動完成:

  • Readline庫,如已經fixje提到,管理命令行編輯,並在按下標籤時調回bash,以啓用完成。然後,Bash給出(參見下一個點)可能完成的列表,並且readline將插入儘可能多的字符,這些字符是已經輸入的字符明確標識的。(您可以非常詳細地配置readline庫,請參閱Bash手冊的Command line editing部分詳細信息)。

  • Bash本身有buildin complete來定義個別命令的完成機制。如果對於當前命令沒有定義,則它使用文件名完成(使用opendir/readdir,如Ignacio所述)。

    Programmable Completion部分描述了定義自己的完井部分。總之,使用 complete «options» «command»您可以定義某個命令的完成。例如complete -u su表示 當完成su命令的參數時,搜索當前系統的用戶

    如果是更復雜的比 正常選項可以覆蓋, 可以使用-F function,然後將調用一個shell函數生成的列表(取決於參數指標,或者根據之前的參數例如不同的完井)可能的完成。 (這是例如用於git的完成,這是非常複雜的,這取決於子,有時 在選項中給出,並使用有時分支的名稱(這是什麼慶典知道)。

你可以使用簡單的complete列出當前bash環境中定義的現有完成,以便對可能的情況有一個印象。如果安裝了bash-completion軟件包(或者它已在系統上命名),那麼可以完成很多命令正如Wrikken所說的那樣,/ etc/bash_completion包含一個bash腳本,該腳本通常在shell啓動時執行以配置此腳本。其他自定義腳本可以放在/etc/bash_completion.d中;那些都來自/ etc/bash_completion。

7

如果您對基本知識感興趣: Bash使用readline,它具有歷史記錄和基本完成功能。如果你想得到詳細的理解,你可以檢查來源。 此外,還可以使用輸入行以完成建立自己的CLI界面