![在 *nix 脚本中使用 '#!'](https://linux22.com/image/1266400/%E5%9C%A8%20*nix%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20'%23!'.png)
在许多 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 上,它不使用这些“魔法”字符,而是将文件扩展名映射到运行它的方式。