协慌网

登录 贡献 社区

什么是首选的 Bash shebang?

在大多数情况下, Bash shebang 是否客观上比其他人更好?

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

我很清楚地回忆起很久以前的一次听说,在最后添加一个破折号可以防止有人将命令传递给你的脚本,但却无法找到任何细节。

答案

你应该使用#!/usr/bin/env bash来实现可移植性 :不同的 * nixes 将bash放在不同的地方,使用/usr/bin/env是一种解决方法来运行在PATH上找到的第一个bash 。而sh不是bash

/bin/sh通常是系统默认 shell 的链接,通常是bash但是打开,例如,Debian 系统是较轻的重量dash 。无论哪种方式,最初的 Bourne shell 都是sh ,所以如果你的脚本使用了一些bash (第 2 代,“Bourne Again sh”)特定功能( [[ ]]测试,数组,各种含糖的东西等),那么你应该是更具体,使用后者。这样,在未安装 bash 的系统上,您的脚本将无法运行。我知道可能有一部关于这种演变的令人兴奋的电影三部曲... 但这可能是传闻。

还要注意,当被唤起为shbash在某种程度上表现为 POSIX 标准 sh (另请参阅GNU 文档 )。

使用 shebang 行来调用适当的解释器不仅仅适用于 BASH。您可以将 shebang 用于系统上的任何解释语言,例如 Perl,Python,PHP(CLI)和许多其他语言。顺便说一句,shebang

#!/bin/sh -

(它也可以是两个破折号,即-- )结束 bash 选项后将被视为文件名和参数。

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

#!/usr/bin/env bash

或者对于 Perl 这样的语言

#!/usr/bin/env perl

请务必查看bashman页:

man bash

env

man env

注意:在基于 Debian 和 Debian 的系统上,如 Ubuntu, shdash而不是bash相关联。由于所有系统脚本都使用sh 。根据 Debian 的说法,这可以让 bash 成长并使系统保持稳定。

另外,保持调用 * nix 就像我从不在 shebang 调用的脚本上使用文件扩展名一样,因为你不能像在 Windows 上那样省略可执行文件调用的扩展名。 file 命令可以将其标识为脚本。