在 *nix 脚本中使用 '#!'

在 *nix 脚本中使用 '#!'

在许多 Apple/Unix 脚本中,我看到一些以“#”开头的内容,据我所知,这意味着它是一个注释。但是,您经常会看到如下所示的 shell 调用(带有 的行#!)。

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

我想知道这是否也只是一条评论,还是它确实起了作用。感谢专家的建议 :-)

答案1

这是定义在脚本执行期间应调用哪个 shell 的方法。它被称为舍邦

例如,具有以下 Shebang 行的文件:

#!/bin/sh

将调用 Bourne (sh) shell。例如,您的脚本:

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

/sbin/route add SUBNET $5在 Bourne shell 解释器中运行。/sbin/route add SUBNET $5只是一条注释,不执行任何操作。 但是,shebang 应该在第一行,因此顶部的注释将不允许 shebang 执行其工作,使其成为无用的添加。

有许多广泛使用的解释器,一些典型的 shebang 行解释器包括:

  • #!/bin/sh— 使用 sh、Bourne shell(或兼容 shell)执行
  • #!/bin/csh— 使用 csh、C shell(或兼容 shell)执行
  • #!/usr/bin/perl— 使用 Perl 执行
  • #!/usr/bin/python— 使用 Python 执行
  • #!/usr/bin/php— 使用 PHP 的命令行解释器执行

正如 Olli 在评论中提到的那样,有时env(环境的缩写)用于确保选择了正确的解释器路径。

答案2

更加技术性的解释:

当您在 UNIX/Linux/Windows/SomeOS/AnyOS 上运行可执行文件时,系统需要知道如何运行它。在 UNIX/Linux 中,文件的前几个字节有特殊规则,用于告诉内核如何运行它。对于脚本,特殊字符是“#!”。如果内核将其视为前两个字符,则它知道该文件是一个脚本,并查看该行的其余部分以查找运行该脚本的可执行文件。因此,如果文件 /path/to/script.sh 开始:

#!/bin/sh

内核会看到“#!”,知道它是一个脚本,然后查找并运行 /bin/sh,并将脚本文件路径 /path/to/script.sh 作为参数传递。由于所有脚本解释器(bash、perl、csh、python 等)都使用“#”作为注释字符,因此它们都会忽略这个“舍邦' 行作为注释。

您可能从未见过这种情况,因为 Windows 的处理方式完全不同。在 Windows 上,它不使用这些“魔法”字符,而是将文件扩展名映射到运行它的方式。

相关内容