什么是首选的Bash shebang?

What is the preferred Bash shebang?

在大多数情况下,是否有比其他人更客观地更好的Bashshebang?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -

我隐约记得很久以前听说在结尾添加破折号会阻止某人向脚本传递命令,但找不到任何细节。


你应该使用#!/usr/bin/env bash作为可移植性:不同的尼克斯把bash放在不同的地方,而使用/usr/bin/env是运行PATH上发现的第一个bash的变通方法。而sh不是bash


/bin/sh通常是指向系统默认shell的链接,后者通常是bash,但在上,例如,debian系统是重量较轻的dash。不管怎样,最初的bourne shell是sh,所以如果脚本使用了一些bash(第二代,"bourne again sh")特定的特性([[ ]]测试、数组、各种糖类等),那么您应该更具体一些,以后再使用。这样,在没有安装bash的系统上,脚本就不会运行。我知道可能会有一部关于这种进化的激动人心的三部曲电影……但那可能是道听途说。

另请注意,当作为sh调用时,bash在某种程度上表现为posix标准sh(另请参见GNU文档)。


使用shebang行调用适当的解释器不仅仅是为了bash。您可以将shebang用于系统上的任何解释语言,如perl、python、php(cli)和许多其他语言。顺便说一下,舍邦

1
#!/bin/sh -

(也可以是两个破折号,即--结束bash选项之后的所有内容都将被视为文件名和参数。

使用env命令使脚本可移植,并允许您为脚本设置自定义环境,因此应使用可移植脚本

1
#!/usr/bin/env bash

或者是任何语言,比如Perl

1
#!/usr/bin/env perl

务必查看bashman页:

1
man bash

env

1
man env

注:在基于Debian和Debian的系统上,如Ubuntu,shdash相连,而不是与bash相连。因为所有系统脚本都使用sh。根据Debian的说法,这允许bash增长,系统保持稳定。

另外,为了保持调用*nix,我从来没有在shebang调用的脚本上使用文件扩展名,因为您不能像在Windows上那样忽略可执行文件调用的扩展名。文件命令可以将其标识为脚本。


我建议使用:

1
#!/bin/bash

它不是100%可移植的(有些系统将bash放在/bin以外的位置),但事实上,许多现有的脚本使用#!/bin/bash对各种操作系统施加压力,使/bin/bash至少与主位置形成符号链接。

备选方案:

1
#!/usr/bin/env bash

有人建议——但不能保证env命令在/usr/bin中(我在没有的地方使用过系统)。此外,此表单将在当前用户$PATH中使用bash的第一个实例,这可能不是bash shell的合适版本。

如果需要在没有/bin/bash的系统上运行脚本,可以修改脚本以指向正确的位置(这显然不方便)。

在我对这个问题的回答中,我更深入地讨论了权衡。


这实际上取决于您如何编写bash脚本。如果您的/bin/sh与bash符号链接,当bash作为sh调用时,某些功能将不可用。

如果您想要bash特定的、非posix特性,请使用#!/bin/bash