[英]Why does line comment tricks for bash not work with exclamation mark "!"
我們可以使用這個技巧
echo abc `#put your comment here` \
def `#another chance for a comment` \
xyz etc
但是如果我們在評論中有感嘆號,這些就不起作用
echo 1 `# 2 !3`
<error>
-bash: !3: event not found
如果我們直接輸入它,它不會被翻譯成一個事件
# 2 !3
<that is OK>
看來我們需要另一個#
符號來解決它。
echo 1 `# 2 #!3`
<that is OK>
1
還是我們必須將前導#
符號加倍?
echo 1 `# # 2 !3`
<that is OK>
1
(以下解釋雖然解釋了一切,但結果證明是錯誤的。請參閱以下更新。)
# !xxx
這按預期工作,因為!
在評論中。
echo # !xxx
這也按預期工作,因為!
也在評論里。
echo `true # !xxx`
這也有效,因為!
仍在評論中,盡管它在`...`
上下文中。
echo `# !xxx`
為什么這不起作用?
我猜當 Bash 解釋`...`
部分時會有一個小錯誤。 在`...`
,Bash 總是(錯誤地)假設第一個WORD 是一個 COMMAND 名稱,所以它不認為!
在評論中,因此觸發歷史擴展。 也就是說, echo `# !xxx`
就像echo `COMMAND !xxx`
。
echo `# # !xxx`
為什么這樣做?
正如#4 中所解釋的,第一個#
被解析為命令,所以它就像echo `COMMAND # !xxx`
所以現在!
在評論中。
echo `## !xxx`
這個雙散列也不起作用。
正如#4和#5 中所解釋的,這里##
是第一個 WORD,它被解析為 COMMAND 名稱,因此它也類似於echo `COMMAND !xxx`
。
請注意,在`...`
上下文中,錯誤僅出現在第一輪語法解析器中。 也就是說,即使 Bash 最初將#
解析為 COMMAND 名稱,它並沒有真正將其作為名為#
的命令運行。
上面的解釋雖然解釋了一切,但結果證明是錯誤的。 請參閱bug-bash 郵件列表中的討論。
我在這里引用 Chet 的解釋以供參考:
> $ set -H > $ true `# !xxx` > bash: !xxx`: event not found
好吧,在單詞的開頭找不到歷史注釋字符 (
#
) (這里#
是單詞`#
) ,因此該行的其余部分被處理以進行歷史擴展。$ true `# # !xxx`
歷史注釋字符位於單詞的開頭(這里第二個
#
本身是一個單詞)並且歷史擴展跳過該行的其余部分。Readline 歷史擴展對 shell 語法知之甚少; 特別是,它不知道反引號。 它從來沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.