首选的 Bash shebang 是什么?

在大多数情况下,是否有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 (第二代,“Bourne Again sh”)特定功能( [[ ]]测试,数组,各种含糖的东西等),那么您应该更具体,请稍后使用。这样,在未安装 bash 的系统上,脚本将无法运行。我了解电影可能会涉及到这种演变的令人兴奋的三部曲... 但是那可能是传闻。

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

我建议使用:

#!/bin/bash

它不是 100%可移植的(某些系统将bash放在/bin以外的位置),但是许多现有脚本使用#!/bin/bash的事实迫使各种操作系统使/bin/bash至少成为一个符号链接。主要位置。

替代方案:

#!/usr/bin/env bash

已经提出了建议 - 但不能保证env命令在/usr/bin (并且我使用过不在其中的系统)。此外,此表单将使用当前用户$PATHbash的第一个实例,这可能不是 bash shell 的合适版本。

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

回答 这个问题时,我已经更深入地讨论了权衡问题

一个有点模糊的更新:我使用的一个系统Termux是运行在 Android 下的类似于 Linux 的桌面层,没有/bin/bashbash/data/data/com.termux/files/usr/bin/bash )- 但它具有特殊的处理功能以支持#!/bin/bash

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

#!/bin/sh -

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

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

#!/usr/bin/env bash

或任何语言,例如 Perl

#!/usr/bin/env perl

确保查看bashman页:

man bash

env

man env

注意:在 Debian 和基于 Debian 的系统(如 Ubuntu)上, sh链接到dash而不是bash 。由于所有系统脚本都使用sh 。据 Debian 称,这可以使 bash 增长并使系统保持稳定。

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

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

如果您想要特定于 bash 的非 POSIX 功能,请使用#!/bin/bash