Linux外壳的奇怪情况

Linux外壳的奇怪情况,linux,shell,shebang,Linux,Shell,Shebang,有人知道下面的脚本为什么有效吗 #a-random-junk-string echo HI shell执行echo命令,并输出HI。我想既然“#”后面没有“!”,shell就会给出一个错误。如果没有#!指定特定的解释器后,内核将不会截取并使用指定的程序启动它 但是,当前的shell仍可能将其解释为命令文件,这就是您看到的情况。当要求shell在打开可执行位的情况下运行一个文件时,它将检查该文件并确定它是否以shebang开头!如果它这样做了,那么它将执行该命令,该命令将从文件的其余部分获取它的

有人知道下面的脚本为什么有效吗

#a-random-junk-string
echo HI
shell执行echo命令,并输出HI。我想既然“#”后面没有“!”,shell就会给出一个错误。

如果没有#!指定特定的解释器后,内核将不会截取并使用指定的程序启动它


但是,当前的shell仍可能将其解释为命令文件,这就是您看到的情况。

当要求shell在打开可执行位的情况下运行一个文件时,它将检查该文件并确定它是否以shebang开头!如果它这样做了,那么它将执行该命令,该命令将从文件的其余部分获取它的程序文本


如果文件不是以shebang开头,那么shell将尝试自己执行它。这就是正在发生的事情,shell将第一行解释为注释。

这是正确的。脚本仍然有效的原因是“#”是Bash/SH/ZSH/etc中的注释字符,因此第一行作为注释被忽略。感谢您的完整回答!实际上,加载程序是这样做的,而不是shell。有关Dennis Ritchie在将此功能添加到Unix时宣布的内容,请参阅。它很好地解释了为什么装载机比shell做得更好。@Dan。谢谢,这很有趣。