最近,我偶然发现了一种我以前从未见过的多行注释类型 - 这是一个脚本示例:
echo a
#
: aaa
: ddd
#
echo b
这似乎有效,甚至vim
语法突出显示它。这种评论风格叫什么?如何找到有关它的更多信息?
答案1
这不是多行注释。 #
是单行注释。
:
(冒号)根本不是注释,而是一个 shell 内置命令,基本上是一个诺普,一个 null 操作,除了返回 true 之外什么都不做true
(因此设置$?
为 0 作为副作用)。然而,由于它是一个命令,它可以接受参数,并且由于它忽略它的参数,因此在大多数情况下,它表面上的作用类似于注释。这种拼凑的主要问题是争论仍在扩大,导致了一系列意想不到的后果。参数仍然受到语法错误的影响,重定向仍然执行,因此: > file
会截断file
,并且: $(dangerous command)
替换仍然会运行。
在 shell 脚本中插入注释的最不令人惊讶的完全安全的方法是使用#
.即使对于多行注释也要坚持这一点。 绝不尝试(ab)使用:
评论。 shell 中没有专用的多行注释机制,类似于类似语言/* */
中的斜杠星号形式。C
为了完整起见,但不是因为这是推荐的做法,我会提到可以使用此处文档进行多行“评论”:
: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment". According to the POSIX spec linked
above, if any character in the delimiter word ("end_long_comment" in
this case) above is quoted, the here-document will not be expanded in
any way. This is **critical**, as failing to quote the "end_long_comment"
will result in the problems with unintended expansions described above.
All of this text in this here-doc goes to the standard input of :, which
does nothing with it, hence the effect is like a comment. There is very
little point to doing this besides throwing people off. Just use '#'.
end_long_comment
答案2
这不是任何评论风格。内置:
命令绝对不执行任何操作;它因在这里发表评论而被滥用。
$ help :
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
答案3
在早期的 shell 中,冒号是创建注释的唯一方法。
但是,这不是真正的注释,因为该行的解析方式与解析任何其他命令的方式完全相同,并且可能会产生副作用。例如:
: ${a:=x} # assigns the value 'x' to the variable, 'a'
: $(command) # executes 'command'
(有时冒号仅用于调用这些副作用的目的,但随后它不会被用作注释。)
有时使用冒号注释掉脚本的一部分会很方便:
: '
while [ "$n" -ne "$x" ]
do
: whatever
done
'
与在每行前面加上 相比,这可以节省大量时间#
,特别是如果注释只是暂时的。
答案4
如果您的评论位于脚本末尾,您可以这样做:
#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~