Bash

Bash/Zsh 在完成時如何辨識相關命令?

  • November 11, 2020

當我開始在互動式登錄 shell(zsh 或 bash)中輸入內容並點擊tab時,shell 會為我提供自動完成建議。

我大致了解如何定義完成規範。供參考,這裡概述:

我不明白的是 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 可能會有類似的實現。

這裡也有一個很好的過程解釋

引用自:https://unix.stackexchange.com/questions/618551