为什么#!/ usr / bin / env bash优于#!/ bin / bash?

我曾经在很多地方看到过,包括对本站的推荐(首选Bash shebang是什么?),使用#!/usr/bin/env bash优先于#!/bin/bash 。 我甚至看到一个有进取心的人建议使用#!/bin/bash是错误的,并且bash功能会因此而丢失。

总而言之,我在严格控制的测试环境中使用bash,每个流通驱动器本质上都是单个主驱动器的克隆。 我理解可移植性的论点,虽然它不一定适用于我的情况。 是否有任何其他理由更喜欢#!/usr/bin/env bash而不是替代品,并假设可移植性是一个问题,是否有任何理由使用它可能会破坏功能?


#!/usr/bin/envbash搜索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中更常见:

  • 某些专注于稳定性的Unix / Linux发行版有时会随着这两种脚本语言的发布而落后。 不久前,RHEL的Perl的版本为5.8.8 - 一个八年的Perl版本! 如果有人想要使用更多现代功能,则必须安装自己的版本。
  • 像Perlbrew和Pythonbrew这样的程序允许你安装这些语言的多个版本。 他们依赖脚本来操纵你的PATH来获得你想要的版本。 硬编码路径意味着我无法在brew下运行我的脚本。
  • 不久之前(好吧,很久以前)Perl和Python不是大多数Unix系统中包含的标准软件包。 这意味着你不知道这两个程序的安装位置。 它在/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

    上一篇: Why is #!/usr/bin/env bash superior to #!/bin/bash?

    下一篇: make #!/usr/bin/env python