假设 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