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

Edg*_*nga 4 unix script shell-script macos

在许多 Apple/Unix 脚本中,我看到前面有“#”的东西,据我所知,这意味着它是一个注释。但是你经常看到如下的 shell 调用(带有 的行#!)。

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

/sbin/route add SUBNET $5
Run Code Online (Sandbox Code Playgroud)

我想知道这是否也只是一个评论,或者它确实做了一些事情。感谢您的专家的建议:-)

Pyl*_*lsa 16

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

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

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

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

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

/sbin/route add SUBNET $5
Run Code Online (Sandbox Code Playgroud)

/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(环境的缩写)用于确保选择正确的解释器路径。

  • shebang 必须是第一行,所以最初的注释行会阻止第二行做任何事情。另一种经常使用的样式是`#!/usr/bin/env python`,它通常会导致脚本由 `PATH` 中首先出现的任何 `python` 运行。这很有用,因为有时可执行文件安装在不同的位置,因此无需修改脚本即可工作。在极少数情况下,`env` 位于其他地方,所以即使这样也会失败。 (9认同)
  • 实际上对于非标准的东西(例如 perl、python 和 php),最好使用 `env`:例如,`#!/usr/bin/env perl`。这将自动为 perl 选择正确的路径,即使它不是 `/usr/bin`。 (4认同)