为什么 : ' ' 是 Bash 中的评论?

Why is : ' ' a comment in Bash?

在bash中,你可以做多行注释,像这样:

: '
echo "You will never see this message :)"
'

但为什么只能这样呢?如果您在冒号后没有 space 的情况下执行此操作,则会发生错误。而且,如果我用撇号中的 echo 执行上面的操作,它仍然不会被机器读取。

: '
echo 'You will also never see this message :D'
'

周围也没有任何东西:

: '
echo You will never see these messages :(

这是如何工作的,为什么我在 bash 中查找有关多行注释的所有内容都告诉我没有这样的东西?

冒号 : 是 built-in bash 命令 essentially does nothing.

来自 bash 文档:

Do nothing beyond expanding arguments and performing redirections. The return status is zero.

因此您可以将 : 视为可以向其传递参数的任何其他 bash 命令。所以它不是评论,但它有点像评论,因为它和传递给它的每个参数都是 no-op。您可以通过创建“评论”功能来完成同样的事情:

comment () {}

comment echo 'You will never see this message'

: 之后需要 space 因为没有 space,整个东西就变成了命令名称。例如,如果您 运行:

:echo 'You will never see this message'

Bash 将其视为 运行 使用参数 `'You will never see this message' 调用 :echo 的命令。它 returns 一个错误,因为没有这样的命令。

第二部分是 bash 如何处理不匹配的引号。 Bash 将继续读取数据,直到遇到匹配的引用。因此,在您的 multi-line 示例中,您将一个参数传递给 : 命令(在第一个示例中)或填充多个参数(在第二个示例中)。

这不是评论。但它没有任何作用,所以它看起来像一个注释。但是它被bash解析和评估:如果你不正确地使用它,你会引入语法错误。


了解 shell 语法和一些 built-in 命令的一些基本构建块将有助于理解这一点。

shell(例如bash)读取命令,从用户输入中找出命令名称和参数,然后运行使用参数发送命令。

例如:

echo hi

被shell解析为带有1个参数hi的命令echo

一般shell吐的东西都是根据spaces/tabs吐出来的。这就是为什么它将 echo hi 解析为两件事。您可以使用单引号和双引号来告诉它以不同的方式解析内容:

echo 'foo bar' baz 'ignore me'

被 shell 解析为带有参数 foo barbazignore me 的命令 echo。请注意,引号不是参数的一部分,它们由 bash.

解析和删除

另一块拼图是内置的 : 命令。 man : 会告诉你这是命令什么都不做。它解析参数,做指示,但自己什么都不做。

这意味着当您输入:

: 'echo hi'

Bash 将其解析为带有参数 echo hi 的命令 :。那么命令就是运行,输出就扔掉了。这没有任何效果,所以感觉像是一个注释(但它实际上不是,不像 # 这是一个注释字符)。

: '
echo 'You will also never see this message :D'
'

被bash解析为带有参数\necho 的命令:(即换行符后跟echo ),You , will, also, never, see, this, message :D 然后 \n (那是,一个换行符)。然后 bash 运行s 这个命令。那什么都不做,所以它再次表现得像评论。