![为什么 Linux 配置文件中的注释行有时会起作用?](https://linux22.com/image/1120584/%E4%B8%BA%E4%BB%80%E4%B9%88%20Linux%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%B3%A8%E9%87%8A%E8%A1%8C%E6%9C%89%E6%97%B6%E4%BC%9A%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我所说的注释行是指:
#!/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 的解释器向后兼容,在这种情况下,它们将被简单地解释为注释并被忽略。