/usr/bin/env 如何知道要使用哪个程序?

/usr/bin/env 如何知道要使用哪个程序?

当我使用 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/binPATH/home/joe/opt/python-2.5/binPATHPATH

#!/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

相关内容