为什么#!/ usr / bin / env bash优于#!/ bin / bash?
我曾经在很多地方看到过,包括对本站的推荐(首选Bash shebang是什么?),使用#!/usr/bin/env bash
优先于#!/bin/bash
。 我甚至看到一个有进取心的人建议使用#!/bin/bash
是错误的,并且bash功能会因此而丢失。
总而言之,我在严格控制的测试环境中使用bash,每个流通驱动器本质上都是单个主驱动器的克隆。 我理解可移植性的论点,虽然它不一定适用于我的情况。 是否有任何其他理由更喜欢#!/usr/bin/env bash
而不是替代品,并假设可移植性是一个问题,是否有任何理由使用它可能会破坏功能?
#!/usr/bin/env
为bash
搜索PATH
,而bash
并不总是在/bin
,特别是在非Linux系统上。 例如,在我的OpenBSD系统上,它位于/usr/local/bin
,因为它作为可选包安装。
如果你完全确定bash
在/bin
并且永远都是,那么把它直接放在你的文件中没有什么坏处 - 但我建议不要这样做,因为脚本和程序的寿命超出了我们最初相信它们的水平。
bash的标准位置是/bin
,我怀疑在所有系统上都是如此。 但是,如果您不喜欢该版本的bash,该怎么办? 例如,我想使用bash 4.2,但我的Mac上的bash是3.2.5。
我可以尝试在/bin
重新安装bash,但这可能不是一个好主意。 如果我更新我的操作系统,它将被覆盖。
但是,我可以在/usr/local/bin/bash
安装/usr/local/bin/bash
,并将PATH设置为:
PATH="/usr/local/bin:/bin:/usr/bin:$HOME/bin"
现在,如果我指定bash
,我不会在/bin/bash
得到旧的cruddy,而是在/usr/local/bin
更新,更炫的。 太好了!
除了我的shell脚本有!# /bin/bash
shebang。 因此,当我运行我的shell脚本时,我得到了甚至没有关联数组的旧式bash版本。
使用/usr/bin/env bash
将使用在我的PATH中找到的bash版本。 如果我设置我的PATH,以便/usr/local/bin/bash
被执行,那是我的脚本将使用的bash。
用bash来看这种情况很少见,但在Perl和Python中更常见:
/bin
吗? /usr/bin
? /opt/bin
? 谁知道? 使用#! /usr/bin/env perl
#! /usr/bin/env perl
意味着我不必知道。 现在为什么你不应该使用#! /usr/bin/env bash
#! /usr/bin/env bash
当路径在shebang中硬编码时,我必须与该解释器一起运行。 因此, #! /bin/bash
#! /bin/bash
迫使我使用默认的安装版本的bash。 由于bash特性非常稳定(尝试在Python 3.x下运行Python脚本的2.x版本),因此我的特定BASH脚本不可能工作,并且由于我的bash脚本可能被此系统和其他系统,使用非标准版本的bash可能会产生不良影响。 这很可能是我想确保稳定的标准版本的bash与我的shell脚本一起使用。 因此,我可能想要硬编码我的shebang中的路径。
为了调用bash
它有点矫枉过正。 除非你在〜/ bin中拥有多个bash
二进制文件,但这也意味着你的代码依赖于具有正确内容的$ PATH。
对于像python
这样的东西来说很方便。 有包装脚本和环境导致使用替代python
二进制文件。
但只要您确定它是您真正想要的二进制文件,就不会通过使用二进制文件的确切路径而丢失任何内容。
链接地址: http://www.djcxy.com/p/46417.html