相关疑难解决方法(0)

为什么最好使用“#!/usr/bin/env NAME”而不是“#!/path/to/NAME”作为我的shebang?

我注意到我从其他人那里获得的一些脚本有 shebang#!/path/to/NAME而其他人(使用相同的工具,NAME)有 shebang #!/usr/bin/env NAME

两者似乎都可以正常工作。在教程中(例如在 Python 上),似乎有人建议后者 shebang 更好。但是,我不太明白为什么会这样。

我意识到,为了使用后一个 shebang,NAME 必须在 PATH 中,而第一个 shebang 没有这个限制。

此外,(对我而言)第一个似乎是更好的shebang,因为它精确地指定了NAME 所在的位置。因此,在这种情况下,如果 NAME 有多个版本(例如,/usr/bin/NAME、/usr/local/bin/NAME),第一种情况指定使用哪个。

我的问题是为什么第一个shebang比第二个更受欢迎?

shell-script shebang

588
推荐指数
10
解决办法
25万
查看次数

如何在脚本的shebang行中拥有不止一种可能性?

我遇到了一个有趣的情况,我有一个 Python 脚本,理论上可以由具有各种环境(和路径)和各种 Linux 系统的各种用户运行。我希望这个脚本尽可能多地在没有人为限制的情况下执行。以下是一些已知的设置:

  • Python 2.6 是系统Python 版本,所以python、python2 和python2.6 都存在于/usr/bin 中(并且是等效的)。
  • Python 2.6 是系统 Python 版本,如上所述,但 Python 2.7 作为 python2.7 安装在它旁边。
  • Python 2.4 是系统 Python 版本,我的脚本不支持。在 /usr/bin 中,我们有 python、python2 和 python2.4,它们是等效的,以及脚本支持的 python2.5。

我想在所有这三个上运行相同的可执行 python 脚本。如果它首先尝试使用 /usr/bin/python2.7 会很好,如果它存在,然后回退到 /usr/bin/python2.6,然后回退到 /usr/bin/python2.5,然后如果这些都不存在,就会出错。不过,我并不太喜欢使用最新的 2.x 版本,只要它能够找到正确的解释器之一(如果存在)。

我的第一个倾向是将 shebang 行从:

#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

#!/usr/bin/python2.[5-7]
Run Code Online (Sandbox Code Playgroud)

因为这在 bash 中工作正常。但是运行脚本会给出:

/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

好的,所以我尝试以下操作,这也适用于 bash:

#!/bin/bash -c /usr/bin/python2.[5-7]
Run Code Online (Sandbox Code Playgroud)

但同样,这失败了:

/bin/bash: - : invalid option
Run Code Online (Sandbox Code Playgroud)

好的,显然我可以编写一个单独的 shell 脚本来找到正确的解释器并使用它找到的任何解释器运行 python 脚本。我只是觉得分发两个文件很麻烦,只要它在安装了最新的 python 2 解释器的情况下运行就足够了。要求人们显式调用解释器(例如,$ python2.5 …

scripting bash python

19
推荐指数
4
解决办法
9504
查看次数

标签 统计

bash ×1

python ×1

scripting ×1

shebang ×1

shell-script ×1