为什么 : ' ' 是 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 bar
、baz
和 ignore 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 这个命令。那什么都不做,所以它再次表现得像评论。
在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 bar
、baz
和 ignore 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 这个命令。那什么都不做,所以它再次表现得像评论。