it-swarm.cn

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

当我使用Shebang #!/usr/bin/env python运行脚本,系统如何知道要使用哪个python?如果我在环境变量中寻找python bin路径,我什么也找不到。

env | grep -i python
65
tMC

Shebang期望使用解释器的完整路径,因此以下语法将不正确:

#!python

设置像这样的完整路径可能会起作用:

#!/usr/local/bin/python

但由于python可能安装在/bin/opt/python/bin或其他任何位置。

使用env

#!/usr/bin/env python

是一种方法,它允许以可移植的方式向OS指定与python首先位于PATH中的路径相同的完整路径。

55
jlliagre

Shebang 行(来自“ sharp bang”,即#!)由内核处理。内核不想知道诸如PATH之类的环境变量。因此,Shebang行上的名称必须是可执行文件的绝对路径。您还可以在脚本名称之前指定一个附加参数,以传递给该可执行文件(具有与系统相关的限制,在此不再赘述)。例如,对于Python脚本,您可以指定

#!/usr/bin/python

在第一行,当您执行脚本时,内核实际上将执行/usr/bin/python /path/to/script。但这并不方便:您需要指定命令的完整路径。如果您在某些计算机上的/usr/bin中有python,而在其他计算机上的是/usr/local/bin,该怎么办?或者您想将PATH设置为/home/joe/opt/python-2.5/bin,以便使用特定版本的Python?由于内核不会为您执行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中查找命令名称,因此非常适合我们的目的。

尽管没有正式保证,但是历史悠久的Unix系统在/usr/bin中提供了env,而现代系统正是由于#!/usr/bin/env的广泛使用而保留了该位置。因此,实际上,指定脚本必须由用户喜欢的Python

#!/usr/bin/env python
61

对,所以运行:

env | grep PATH

您的$ PATH是目录列表。 Unix将按顺序遍历该目录列表,直到找到“ python”为止。

您可以使用“哪个”命令查看找到的目录:

which python
7
Dan Rue