为什么 Linux 配置文件中的注释行有时会起作用?

为什么 Linux 配置文件中的注释行有时会起作用?

我所说的注释行是指:

#!/usr/bin/perl -w

文件中的注释/boot/grub/menu.lst如下所述超级用户的这个答案

它已经有注释了,即该行以 开头#,但仍在解释。为什么会这样?

答案1

在许多语言中,以 开头的任何行#都是注释,会被解释器忽略(perl等等)。

然而,如果第一行Linux 中的脚本以#!(开头舍邦正如它所称的),它不是一个评论,而是一个指令程序加载器实际运行之后指定的程序#!并将文件的名称作为最后一个参数传递给它。

例如,如果第一行是

#!/usr/bin/perl -w

这意味着 shell 将实际调用/usr/bin/perl -w /path/to/the/script,并且您不需要指定程序来运行此脚本,您可以使用以下命令运行它

/path/to/the/script

如果您有权限运行它,并且它位于支持执行的文件系统上,并且该文件具有执行的权限。

然而,对于解释器来说,这一行始终只是一个注释,因此如果脚本执行如下:

perl /path/to/the/script

那么该行将不起作用。(感谢鲁斯兰指出这一点)。

请注意,这#并不总是表示注释。例如,#C 语言中以 a 开头的语句是预处理指令并无评论。

在您的情况下,该行是注释,在执行时将被忽略。

更新:

您正在讨论的文件是,menu.lst其中的注释是以 开头的行##,而不是#(来源)

答案2

以 开头的行#!仍然是注释,因为它不像普通命令那样执行。

但这不仅是一个有效的评论,而且也是一个哈希邦,如果脚本被单独调用,该行可用于指示用来执行这些命令的解释器。

Hashbang 以 开头,#以便与不读取 hashbang 的解释器向后兼容,在这种情况下,它们将被简单地解释为注释并被忽略。

相关内容