簡體   English   中英

為什么 bash 的行注釋技巧不適用於感嘆號“!”

[英]Why does line comment tricks for bash not work with exclamation mark "!"

參考Bash 的內聯注釋?

我們可以使用這個技巧

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

(以下解釋雖然解釋了一切,但結果證明是錯誤的。請參閱以下更新。)

  1. # !xxx

這按預期工作,因為! 在評論中。

  1. echo # !xxx

這也按預期工作,因為! 也在評論里。

  1. echo `true # !xxx`

這也有效,因為! 仍在評論中,盡管它在`...`上下文中。

  1. echo `# !xxx`

為什么這不起作用?
我猜當 Bash 解釋`...`部分時會有一個小錯誤 `...` ,Bash 總是(錯誤地)假設第一個WORD 是一個 COMMAND 名稱,所以它不認為! 在評論中,因此觸發歷史擴展。 也就是說, echo `# !xxx`就像echo `COMMAND !xxx`

  1. echo `# # !xxx`

為什么這樣做?
正如#4 中所解釋的,第一個#被解析為命令,所以它就像echo `COMMAND # !xxx`所以現在! 在評論中。

  1. echo `## !xxx`

這個雙散列也不起作用。
正如#4#5 中所解釋的,這里##是第一個 WORD,它被解析為 COMMAND 名稱,因此它也類似於echo `COMMAND !xxx`

請注意,在`...`上下文中,錯誤僅出現在第一輪語法解析器中 也就是說,即使 Bash 最初將#解析為 COMMAND 名稱,它並沒有真正將其作為名為#的命令運行。


更新 2020-03-04

上面的解釋雖然解釋了一切,但結果證明是錯誤的 請參閱bug-bash 郵件列表中的討論

我在這里引用 Chet 的解釋以供參考:

 > $ set -H > $ true `# !xxx` > bash: !xxx`: event not found

好吧,在單詞的開頭找不到歷史注釋字符 ( # ) (這里#單詞`# ,因此該行的其余部分被處理以進行歷史擴展。

 $ true `# # !xxx`

歷史注釋字符位於單詞的開頭(這里第二個#本身是一個單詞並且歷史擴展跳過該行的其余部分。

Readline 歷史擴展對 shell 語法知之甚少; 特別是,它不知道反引號。 它從來沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM