脚本中的 Shebang 序列

脚本中的 Shebang 序列

假设 shebang 序列包含在一个编写在单独文件中的脚本中;例如,我创建一个example.sh脚本文件。

如果我在文件中添加 shebang 序列:

 #!/bin/sh

我如何确定上面的命令不会被识别为注释(在 Linux Bash 脚本中,#通常被视为注释的开始。

答案1

只有当脚本可执行且“#!”时,shebang 才是真正的 shebang。是文件的前两个字符。

操作系统实际上是在文件中检查前两个字节,并发现它们是(十六进制)“23”和“21”,它们是“#”和“!”的 ASCII 代码。

如果这些内容稍后出现在文件中,或者您没有直接执行该文件,则该行确实会被视为注释,因为它以 # 开头。

事实上,如果该行是:

#!/bin/sh

然后操作系统找到 shebang 并因此运行:

/bin/sh [filename]

/bin/sh 运行脚本时忽略 shebang 行作为注释。

当涉及到一些不用作#注释的其他语言时,通常会向解释器传递一个特殊标志,以便它知道忽略第一行(例如#!/usr/local/bin/tcc -run)。

答案2

原来的shell没有这个功能,但是有注释。需要一种机制,以便用户可以指定使用哪个 shell/解释器。此机制不得不必要地破坏旧系统(为原始 shell 编写的任何新脚本必须允许指定原始 shell,并且不得破坏不知道此新 shell 的旧系统(运行原始 shell 的早期版本)因此,它必须看起来像对原始 shell 的注释。这个新系统还必须减少错误触发的风险,同时不给未来的用户带来负担。

因此决定在文件开头添加特殊注释。

答案3

这是Denis Ritchie在UNIX shell中引入的机制,所以Linux shell确实继承了这个特性。正是在 shell 本身中,检查第一行是否有这个“魔术字符串”,如果找到,则使用 shebang 之后指定的解释器。第一次提到这个功能的邮件是在一些bsd4.0源代码中引用的,你可以在这里看到它:http://www.in-ulm.de/~mascheck/various/shebang/4.0BSD_newsys_sys1.c.html

相关内容