Bash
Bash/Zsh 在完成時如何辨識相關命令?
當我開始在互動式登錄 shell(zsh 或 bash)中輸入內容並點擊tab時,shell 會為我提供自動完成建議。
我大致了解如何定義完成規範。供參考,這裡概述:
- 重擊:https ://www.gnu.org/software/bash/manual/bash.html#Programmable-Completion
- Zsh:http: //zsh.sourceforge.net/Doc/Release/Completion-System.html
我不明白的是 bash/zsh 如何辨識當使用者按下選項卡時要完成哪個命令,即如果我這樣做
ls [tab]
了,bash/zsh 如何辨識ls
。換句話說,bash/zsh 如何知道使用ls
完成規範生成完成。一些更複雜的解析範例,其中 Bash/Zsh 仍然正確:
ls [tab]
-> 完成ls
echo $( echo $(ls [tab]
-> 完成ls
echo hi; git a[tab]
-> 完成git
echo 'cd [tab]
-> 沒有完成cd
echo "$(ls [tab]
-> 完成ls
echo $( echo hi | ls [tab]
-> 完成ls
(我知道
ls
不使用標準輸入,但這個例子仍然說明了 bash/zsh 的解析能力)我假設 bash/zsh 正在使用某種解析器。但是,它不是一個普通的解析器。它在沒有適當結構的命令的情況下完成。它知道某些東西在引號或外殼擴展中,即使它們沒有關閉。
bash/zsh 執行什麼功能來“辨識”相關命令或確定是否有命令要完成?
bash/zsh 執行什麼功能來“辨識”相關命令或確定是否有命令要完成?
當您按下 時
tab
,readline 會執行該complete
功能。您可以在以下位置覆蓋它
~/.inputrc
:"\t": complete
complete
定義lib/readline/funmap.c
為:static const FUNMAP default_funmap[] = { [..] { "complete", rl_complete },
rl_complete
可以在lib/readline/complete.c
(瀏覽原始碼)中找到:/* Complete the word at or before point. You have supplied the function that does the initial simple matching selection algorithm (see rl_completion_matches ()). The default is to do filename completion. */ int rl_complete (int ignore, int invoking_key) { ..
這是起點。它分解單詞,檢查哪些完成已註冊,然後查找相關完成。
zsh 可能會有類似的實現。
這裡也有一個很好的過程解釋。