【问题标题】:Why shebang `env <executable>` instead of `executable`, even when there is no need to pre-set environment variables?为什么 shebang `env <executable>` 而不是 `executable`,即使不需要预先设置环境变量?
【发布时间】:2017-11-10 14:08:27
【问题描述】:

为什么推荐使用 /usr/bin/env python 而不是 /usr/bin/python。 这是从阅读这里的回复中得到启发的: What do I use on linux to make a python program executable

我认为两者都会做完全相同的事情,但是提到两者的答案相同有 2 票,而不是说使用 env 的答案有 88 票。人们似乎真的同意使用 env,但没有解释为什么。 env 是否可以帮助您找到任何名为“python”的可执行文件,而不仅仅是用户可以自定义的特定路径中的可执行文件?

我真的很想知道使用 env 的各种优势和用例,man env 没有解释它。 man env 只是说你可以在运行前使用 env 设置环境变量,NAME=VALUE,但我们在链接的例子中没有这样做。

我觉得社区显然在推荐使用 env,但我自己的研究并没有暗示原因,所以如果你知道为什么这样做是好的或好的风格,请回答。

【问题讨论】:

标签: shell executable shebang


【解决方案1】:

使用#!/usr/bin/env python 可确保使用当前定义的 PATH 中的第一个 Python 解释器,尊重任何用户覆盖(对于 Python,包括 virtualenvs 等)。

这对于 MacOS 等环境尤其重要,在这些环境中,OS 供应商的软件包通常已经过时(例如,/bin/bash 是 3.2——2006 年的发布系列——而如果用户有 MacPorts 或Homebrew、/opt/local/bin/bash/usr/local/bin/bash 可能是现代 4.x;因此,#!/usr/bin/env bash 将受益于用户安装的任何更新的 bash 解释器,无论是系统范围内还是在其主目录下,只要该解释器的位置在运行时存在于其 PATH 中)。

【讨论】:

  • 不只是版本,有时甚至存在。如果脚本硬编码#!/usr/bin/python,但系统安装了/bin/python,所有脚本都会失败。
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2023-01-27
相关资源
最近更新 更多