貼上以製表符開頭的 Bash 命令時完成

貼上以製表符開頭的 Bash 命令時完成

我正在編寫一個Dockerfile使用選項卡進行格式化的文件(我通常在任何地方都使用它)。

但我複製了一個多行命令,其中第二行以兩個製表符開頭,即:

apt-get -y update && \
    apt-get -y install collectd \ # begin two tabs

第一行正確執行,但第二行嘗試“自動完成”,顯示所有可能的命令,然後:

> stall collectd
# [ apt-get updating ]
bash: stall: command not found

我理解「自動完成」行為,但是stall collectd?為什麼 Bash 會吃掉這個apt-get -y in部分?

答案1

混沌的回答清楚地解釋瞭如何禁用此行為,但我將這個問題解釋為出於對命令第一部分發生的情況的好奇apt-get

如果您要輸入兩個選項卡,Bash 會詢問您是否願意,

顯示所有 5177 種可能性? (是或n)?

請注意,可能性的數量取決於您自己的環境。

如果您要回覆字串中的任何字符apt-get -,Bash 會忽略它們,因為它只需要「是」或「否」。當它得到 時y,它會顯示所有可能性。

在現代版本的 Bash 中,此清單顯示在More?底部有提示的尋呼機中。尋呼機使用空格字符向下滾動頁面,忽略後面的i字符,但下一個字符n被解釋為“否”以退出尋呼機。

最後,剩餘的字元stall collectd被 shell 解釋為命令。

答案2

bash您可以停用按鍵時的完成行為tab

bind 'set disable-completion on'

現在,該tab鍵只是像在編輯器中一樣縮排該行。這只是暫時的。在下一個 shell 會話中它不會被設定。如果您想讓它永久存在,請將其添加到您的~/.inputrc.

若要重新啟用tab金鑰,請使用:

bind 'set disable-completion off'

相關內容