1346

对于大多数用途,客观上是否有任何Bash舍邦比其他更好?

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

我隐约记得很久以前听说在末尾添加破折号可以防止有人将命令传递给您的脚本,但找不到任何详细信息。

4

7 回答 7

1797

您应该使用#!/usr/bin/env bash可移植性不同的 *nixes 放在bash不同的地方,使用/usr/bin/env是一种解决方法来运行bashPATH. 而sh不是bash

于 2012-04-30T12:14:50.937 回答
125

我建议使用:

#!/bin/bash

它不是 100% 可移植的(一些系统放置bash在./bin#!/bin/bash/bin/bash

替代方案:

#!/usr/bin/env bash

已被建议 - 但不能保证该env命令在/usr/bin(而且我使用了不存在的系统)。此外,此表单将使用bash当前 users 中的第一个实例$PATH,这可能不是 bash shell 的合适版本。

(但是/usr/bin/env应该可以在任何相当现代的系统上工作,要么是因为env它在其中,要么是/usr/bin因为系统做了一些事情来使它工作。我上面提到的系统是 SunOS 4,我可能已经有 25 年没有使用它了。)

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

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

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

于 2018-10-17T17:49:37.440 回答
88

/bin/sh is usually a link to the system's default shell, which is often bash but on, e.g., Debian systems is the lighter weight dash. Either way, the original Bourne shell is sh, so if your script uses some bash (2nd generation, "Bourne Again sh") specific features ([[ ]] tests, arrays, various sugary things, etc.), then you should be more specific and use the later. This way, on systems where bash is not installed, your script won't run. I understand there may be an exciting trilogy of films about this evolution...but that could be hearsay.

Also note that when evoked as sh, bash to some extent behaves as POSIX standard sh (see also the GNU docs about this).

于 2012-04-29T21:39:45.507 回答
33

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

#!/bin/sh -

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

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

#!/usr/bin/env bash

或者对于任何语言,例如 Perl

#!/usr/bin/env perl

请务必查看以下man页面bash

man bash

env

man env

注意:在 Debian 和基于 Debian 的系统上,例如 Ubuntu,sh链接到dashnot bash. 由于所有系统脚本都使用sh. 根据 Debian 的说法,这允许 bash 增长并使系统保持稳定。

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

于 2016-10-26T19:55:26.357 回答
6

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

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

于 2012-04-29T22:36:34.793 回答
2

为 #!/usr/bin/env 方法再投一票。我经常使用虚拟环境,就我而言,我使用安装在 virtualenv 中的 python。使用 #!/usr/bin/python 可能不是我想要的 python。我使用 #!/usr/bin/env python 得到了正确的 python。

于 2021-08-27T16:52:51.710 回答
0

#!/bin/sh

因为大多数脚本不需要特定的 bash 功能,应该为 sh 编写。

此外,这使得脚本可以在默认情况下没有 bash 的 BSD 上运行。

于 2021-02-09T07:05:10.290 回答