多行 shell 脚本注释 - 这是如何工作的?

多行 shell 脚本注释 - 这是如何工作的?

最近,我偶然发现了一种我以前从未见过的多行注释类型 - 这是一个脚本示例:

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{|}~

相关内容