为什么shebang的第二部分有优先权?

Dim*_*ims 0 python shebang

我在与python默认值不同的可执行文件下运行 python 脚本。

/usr/bin/mydir/mybins.

如果我跑,我得到:

$which python
/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

如果运行run.py

# cat run.py
#!/usr/bin/env /mydir/mybins/python

import os
import sys

print(u"Python executable: %s" % sys.executable)
print(u"From within Python PATH=%s" % os.environ[u"PATH"])
Run Code Online (Sandbox Code Playgroud)

我得到

# ./run.py
Python executable: /mydir/mybins/python
From within Python PATH=/usr/bin:... (and no /mydir/mybins)
Run Code Online (Sandbox Code Playgroud)

为什么?这是故意的吗?如何在/usr/bin/python不更改代码的情况下使用它?

Kus*_*nda 5

env实用程序将其参数作为命令执行。

如果参数没有给出路径,如在 中env python,命令将在 中查找$PATHenv#!脚本的-line 中使用时,这通常是您想要的。

如果参数一个给定的路径,将在该路径执行命令。

在您的#!-line 中,您执行特定的 Python 解释器。将$PATH永远不会被搜索到。你也可以

#!/mydir/mybins/python
Run Code Online (Sandbox Code Playgroud)

因为这个env位实际上什么都不做。

要让$PATH效果生效,请使用

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

然后将使用python找到的第一个可执行文件$PATH

另一种方法是#!通过在命令行上使用显式解释器执行脚本来完全绕过-line:

$ python run.py
Run Code Online (Sandbox Code Playgroud)

或者,

$ /usr/bin/python run.py
Run Code Online (Sandbox Code Playgroud)