当我使用 shebang#!/usr/bin/env python
运行脚本时,系统如何知道python
使用哪个?如果我python
在环境变量中查找bin 路径,我什么也找不到。
env | grep -i python
答案1
这舍邦行(来自“sharp bang”,即#!
)由内核处理。内核不想知道诸如这样的环境变量PATH
。因此,shebang 行上的名称必须是可执行文件的绝对路径。您还可以在脚本名称之前指定要传递给该可执行文件的附加参数(具有系统相关的限制,我不会在这里讨论)。例如,对于 Python 脚本,您可以指定
#!/usr/bin/python
在第一行,当您执行脚本时,内核实际上会执行/usr/bin/python /path/to/script
.但这并不方便:您需要指定命令的完整路径。如果您在某些机器上和其他机器上都有python
权限怎么办?或者您想将其设置为使用特定版本的Python?由于内核不会为您进行查找,因此我们的想法是让内核运行一个命令,依次在以下位置查找所需的解释器:/usr/bin
/usr/local/bin
PATH
/home/joe/opt/python-2.5/bin
PATH
PATH
#!/fixed/path/to/path-lookup-command python
它path-lookup-command
必须将可执行文件的名称作为参数并查找PATH
并执行它:内核将运行/fixed/path/to/path-lookup-command python /path/to/script
。碰巧的是,env
命令就是这样做的。它的主要目的是在不同的环境中运行命令,但由于它在 中查找命令名称$PATH
,因此它非常适合我们的目的。
尽管官方没有保证这一点,但由于env
.因此,在实践中,指定脚本必须由用户最喜欢的Python解释器执行的方法是/usr/bin
#!/usr/bin/env
#!/usr/bin/env python
答案2
shebang 需要解释器使用的完整路径,因此以下语法将是不正确的:
#!python
设置像这样的完整路径可能会起作用:
#!/usr/local/bin/python
但不可移植,因为 python 可能安装在/bin
、/opt/python/bin
或任何其他位置。
使用env
#!/usr/bin/env python
是一种允许以可移植的方式向操作系统指定完整路径的方法,该完整路径python
相当于PATH
.
答案3
对了,所以运行:
env | grep PATH
您的 $PATH 是目录列表。 Unix 将按顺序遍历该目录列表,直到找到“python”。
您可以使用“which”命令查看它找到的目录:
which python