gpt4 book ai didi

bash - 为什么 bash 的行注释技巧不适用于感叹号 "!"

转载 作者:行者123 更新时间:2023-12-03 23:49:12 29 4
gpt4 key购买 nike

引用 Inline comments for 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

最佳答案

(下面的解释原来是 错误的 虽然它解释了一切。参见 UPDATE 如下。)

  • # !xxx

  • 这按预期工作,因为 !在评论中。
  • echo # !xxx

  • 这也按预期工作,因为 !也在评论里。
  • echo `true # !xxx`

  • 这也有效,因为 !仍在评论中,尽管它在 `...` 中语境。
  • echo `# !xxx`

  • 为什么这不起作用?
    我猜有一点 错误 当 Bash 解释 `...`部分。在 `...` , Bash 总是(错误地)假设 第一 WORD 是一个 COMMAND 名称,所以它不认为 !在评论中,因此触发历史扩展。也就是说, echo `# !xxx`就像 echo `COMMAND !xxx` .
  • echo `# # !xxx`

  • 为什么这样做?
    中所述#4 ,第一 #被解析为 COMMAND 所以它就像 echo `COMMAND # !xxx`所以现在 !在评论中。
  • echo `## !xxx`

  • 这个双散列也不起作用。
    中所述#4 #5 ,这里 ##是第一个 WORD,它被解析为 COMMAND 名称,所以它也像 echo `COMMAND !xxx` .
    注意,在 `...`上下文, 错误 仅在第一轮语法 解析器 .也就是说,即使 Bash 最初解析 #作为命令名称,它并没有真正将其作为名为 # 的命令运行。 .

    更新 2020-03-04
    上面的解释竟然是 错误 虽然它解释了一切。请查看 the discussion in bug-bash mailing list .
    我在这里引用 Chet 的解释以供引用:
    > $ set -H
    > $ true `# !xxx`
    > bash: !xxx`: event not found

    Well, the history comment character (#) is not found at the start of aword (here # is part of the word `#), so the rest of the line is processed for history expansion.

    $ true `# # !xxx`

    The history comment character is found at the start of a word (here the 2nd # itself is a word) and historyexpansion skips the rest of the line.

    Readline history expansion knows very little about shell syntax; inparticular, it doesn't know backquotes. It never has.

    关于bash - 为什么 bash 的行注释技巧不适用于感叹号 "!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166019/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com