当我使用shebang #!/usr/bin/env python
运行脚本时,系统如何知道python
要使用哪个脚本?如果我python
在环境变量中查找bin路径,我什么也找不到。
env | grep -i python
当我使用shebang #!/usr/bin/env python
运行脚本时,系统如何知道python
要使用哪个脚本?如果我python
在环境变量中查找bin路径,我什么也找不到。
env | grep -i python
Answers:
的井号线(从“锋利砰”,即#!
)由内核处理。内核不想知道环境变量,例如PATH
。因此,shebang行上的名称必须是可执行文件的绝对路径。您还可以在脚本名称之前指定一个附加参数,以传递给该可执行文件(具有与系统相关的限制,我在这里不再赘述)。例如,对于Python脚本,您可以指定
#!/usr/bin/python
在第一行,执行脚本时,内核实际上将执行/usr/bin/python /path/to/script
。但这并不方便:您需要指定命令的完整路径。如果您有什么python
在/usr/bin
某些机器上和/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
,因此非常适合我们的目的。
尽管没有正式保证,但是提供env
了历史悠久的Unix系统/usr/bin
,而现代系统正是由于广泛使用,所以保留了该位置#!/usr/bin/env
。因此,实际上,指定脚本必须由用户喜欢的Python解释器执行的方法是
#!/usr/bin/env python
env
和之间最好选择哪一个which
?因为这还将从我的PATH环境中获取最合格的可执行文件。
which
找到可执行文件并打印其路径。env
查找第一个参数指定的程序并执行,然后将其余参数传递给它。
env
是which
本质上的评估版本。
对,所以运行:
env | grep PATH
您的$ PATH是目录列表。Unix将按顺序遍历该目录列表,直到找到“ python”为止。
您可以使用“哪个”命令查看找到的目录:
which python
sys.path
激活的env $ env python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
)和./env/bin/python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']
)之间的python有所不同。