Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么bash的行注释技巧不适用于感叹号“quot;”&引用;_Bash - Fatal编程技术网

为什么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`