为什么bash的行注释技巧不适用于感叹号“quot;”&引用;
参考号 我们可以使用这些技巧为什么bash的行注释技巧不适用于感叹号“quot;”&引用;,bash,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 还是必须将前导的#符号加倍 echo 1 `# # 2 !3` <that is OK> 1 echo
echo abc `#put your comment here` \
def `#another chance for a comment` \
xyz etc
但如果我们在评论中有一个感叹号,这些就不起作用了
echo 1 `# 2 !3`
<error>
-bash: !3: event not found
还是必须将前导的#
符号加倍
echo 1 `# # 2 !3`
<that is OK>
1
echo 1`##2!3`
1.
(下面的解释被证明是错误的,尽管它解释了一切。请参见下面的更新。)
#!xxx
代码>在注释中
echo#!xxx
这也可以像预期的那样工作,因为代码>也在注释中
echo'true#!xxx`
这同样有效,因为
仍然在注释中,尽管它在`…`
上下文中
echo`#!xxx`
为什么这不起作用?
我想当Bash解释` `
部分时,会有一点错误。在`…`
中,Bash总是(错误地)假定第一个单词是命令名,因此它不认为代码>位于注释中,因此会触发历史扩展。也就是说,echo`#!xxx`
就像echo`命令一样!xxx`
echo`##!xxx`
为什么这样做?
正如在#4中所解释的,第一个#
被解析为一个命令,因此它就像echo`COMMAND#!xxx`
所以现在代码>在注释中
echo`##!xxx`
此双哈希也不起作用。
如#4和#5中所述,这里的##
是第一个单词,它被解析为命令名,因此它也类似于echo`COMMAND!xxx`
注意,在`…`
上下文中,bug仅在第一轮语法解析器中出现。这就是说,尽管Bash最初将
解析为命令名,但它实际上并没有将其作为名为
的命令运行
更新2020-03-04
上述解释被证明是错误的,尽管它解释了一切。请看
为了便于参考,我在这里引用切特的解释:
好的,历史注释字符(#
)不在
word(此处
是单词`
的一部分),因此该行的其余部分将被处理以进行历史扩展
$ true `# # !xxx`
历史注释字符位于单词的开头(这里第二个#
本身就是一个单词)和历史
扩展跳过了线路的其余部分
Readline history expansion对shell语法知之甚少;在里面
特别是,它不知道反报价。从来没有过。
这不是特定于注释的,在其他代码中也会遇到同样的问题。您需要单引号引用您的评论,或者使用set+H
禁用历史扩展这是否回答了您的问题@Aaron这似乎是一个不同的issueYeah,因为问题的OP使用了一种现在可以使用但在bash<4.4中无法使用的语法。问题和各种答案确实讨论了历史的扩展,这是你问题的根源。引用你的感叹号不管用吗?@Aaron quote不管用,但我发现双前导散列可以解决问题
echo 1 `# # 2 !3`
<that is OK>
1
> $ set -H
> $ true `# !xxx`
> bash: !xxx`: event not found
$ true `# # !xxx`