对于大多数用途,是否有客观的Bash
shebang比其他人更好?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
我很清楚地回忆起很久以前听说过在最后添加一个破折号可以防止有人将命令传递给你的脚本,但是找不到任何有关它的细节。
答案 0 :(得分:1293)
您应该对portability使用 #!/usr/bin/env bash
:不同的* nixes将bash
放在不同的位置,使用/usr/bin/env
是一种解决方法在bash
找到的第一个PATH
。 sh
is not bash
。
答案 1 :(得分:71)
/bin/sh
通常是指向系统默认shell的链接,通常为bash
但是,例如,Debian系统的权重较轻dash
。无论哪种方式,原始Bourne shell都是sh
,所以如果你的脚本使用了一些bash
(第二代,“Bourne Again sh”)特定功能([[ ]]
测试,数组,各种含糖的东西,等等,那么你应该更具体,并使用后者。这样,在未安装bash的系统上,您的脚本将无法运行。我知道可能有一部关于这种演变的令人兴奋的电影三部曲......但这可能是传闻。
另请注意,在sh
,bash
某种程度上被behaves as POSIX standard sh
唤起时(另请参阅the GNU docs)。
答案 2 :(得分:17)
使用shebang行来调用适当的解释器不仅仅适用于BASH。您可以将shebang用于系统上的任何解释语言,例如Perl,Python,PHP(CLI)和许多其他语言。顺便说一下,shebang
#!/bin/sh -
(它也可以是两个破折号,即--
)结束bash选项后将被视为文件名和参数的所有内容。
使用env
命令使您的脚本可移植,并允许您为脚本设置自定义环境,因此可移植脚本应使用
#!/usr/bin/env bash
或者用于Perl等语言
#!/usr/bin/env perl
请务必查看man
的{{1}}页:
bash
和man bash
:
env
注意:在基于Debian和Debian的系统(如Ubuntu)上,man env
与sh
而不是dash
相关联。由于所有系统脚本都使用bash
。根据Debian的说法,这可以让bash增长并使系统保持稳定。
另外,为了保持调用* nix,我从不在shebang调用的脚本上使用文件扩展名,因为你不能像在Windows上那样省略可执行文件调用的扩展名。 file命令可以将其标识为脚本。
答案 3 :(得分:10)
我建议使用:
#!/bin/bash
它不是100%可移植的(某些系统将bash
放置在/bin
以外的位置),但是许多现有脚本使用#!/bin/bash
的事实迫使各种操作系统不得不/bin/bash
至少是指向主要位置的符号链接。
以下选择:
#!/usr/bin/env bash
建议使用,但是不能保证env
中包含/usr/bin
命令(并且我使用的系统不是)。此外,此表单将使用当前用户bash
中的$PATH
的第一个实例,这可能不是bash shell的合适版本。
如果您需要一个脚本在没有/bin/bash
的系统上运行,则可以修改该脚本以指向正确的位置(这很不方便)。
我已经在my answer到this question中更深入地讨论了权衡问题。
答案 4 :(得分:3)
这实际上取决于你编写bash脚本的方式。如果您的/bin/sh
符号链接为bash,则将bash调用为sh
,some features are unavailable。
如果您需要特定于bash的非POSIX功能,请使用#!/bin/bash
答案 5 :(得分:0)
#!/bin/sh
因为大多数脚本不需要特定的 bash 功能,应该为 sh 编写。
此外,这使得脚本可以在默认情况下没有 bash 的 BSD 上运行。