在大多数情况下, Bash
shebang 是否客观上比其他人更好?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
我很清楚地回忆起很久以前的一次听说,在最后添加一个破折号可以防止有人将命令传递给你的脚本,但却无法找到任何细节。
/bin/sh
通常是系统默认 shell 的链接,通常是bash
但是打开,例如,Debian 系统是较轻的重量dash
。无论哪种方式,最初的 Bourne shell 都是sh
,所以如果你的脚本使用了一些bash
(第 2 代,“Bourne Again sh”)特定功能( [[ ]]
测试,数组,各种含糖的东西等),那么你应该是更具体,使用后者。这样,在未安装 bash 的系统上,您的脚本将无法运行。我知道可能有一部关于这种演变的令人兴奋的电影三部曲... 但这可能是传闻。
还要注意,当被唤起为sh
, bash
在某种程度上表现为 POSIX 标准 sh
(另请参阅GNU 文档 )。
使用 shebang 行来调用适当的解释器不仅仅适用于 BASH。您可以将 shebang 用于系统上的任何解释语言,例如 Perl,Python,PHP(CLI)和许多其他语言。顺便说一句,shebang
#!/bin/sh -
(它也可以是两个破折号,即--
)结束 bash 选项后将被视为文件名和参数。
使用env
命令可以使脚本具有可移植性,并允许您为脚本设置自定义环境,因此可移植脚本应该使用
#!/usr/bin/env bash
或者对于 Perl 这样的语言
#!/usr/bin/env perl
请务必查看bash
的man
页:
man bash
和env
:
man env
注意:在基于 Debian 和 Debian 的系统上,如 Ubuntu, sh
与dash
而不是bash
相关联。由于所有系统脚本都使用sh
。根据 Debian 的说法,这可以让 bash 成长并使系统保持稳定。
另外,保持调用 * nix 就像我从不在 shebang 调用的脚本上使用文件扩展名一样,因为你不能像在 Windows 上那样省略可执行文件调用的扩展名。 file 命令可以将其标识为脚本。