对于大多数用途,客观上是否有任何Bash
舍邦比其他更好?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- ETC
我隐约记得很久以前听说在末尾添加破折号可以防止有人将命令传递给您的脚本,但找不到任何详细信息。
我建议使用:
#!/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
( bash
is /data/data/com.termux/files/usr/bin/bash
) - 但它有特殊的处理来支持#!/bin/bash
。
/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).
使用 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
链接到dash
not bash
. 由于所有系统脚本都使用sh
. 根据 Debian 的说法,这允许 bash 增长并使系统保持稳定。
此外,为了保持调用 *nix 就像我从不在 shebang 调用的脚本上使用文件扩展名一样,因为你不能像在 Windows 上那样省略可执行文件调用的扩展名。file 命令可以将其识别为脚本。
这实际上取决于您如何编写 bash 脚本。如果您/bin/sh
的符号链接到 bash,当 bash 被调用为 时sh
,某些功能不可用。
如果您想要特定于 bash 的非 POSIX 功能,请使用#!/bin/bash
为 #!/usr/bin/env 方法再投一票。我经常使用虚拟环境,就我而言,我使用安装在 virtualenv 中的 python。使用 #!/usr/bin/python 可能不是我想要的 python。我使用 #!/usr/bin/env python 得到了正确的 python。
#!/bin/sh
因为大多数脚本不需要特定的 bash 功能,应该为 sh 编写。
此外,这使得脚本可以在默认情况下没有 bash 的 BSD 上运行。