在脚本的shebang中使用env
Python脚本与其他任何语言的脚本没有区别。
无论是使用#!/usr/bin/env python
还是#!/usr/bin/python
,如果脚本是可执行的,并且在调用时没有指定语言,那么脚本将调用相应语言的解释器来运行脚本中的代码,而shebang就是找到解释器的"指南",在你的例子中是python
。
使用#!/usr/bin/env python
而不是绝对路径的#!/usr/bin/python
可以确保找到python(或任何其他语言的解释器),以防它在不同的Linux或类Unix发行版中的位置可能不完全相同,例如在这里here中解释。
尽管#!/usr/bin/python
在默认的Ubuntu系统上可以工作,但使用#!/usr/bin/env python
是一个好习惯。
关于env
env
是一个可执行文件,位于 /usr/bin
,或者如 @hvd 所提到的(感谢提示!),作为一个兼容性符号链接在几乎所有 Linux 发行版中都可以在 /usr/bin
中找到。
来自维基百科:
env是Unix和类Unix操作系统的一个shell命令。它用于打印环境变量列表或在修改当前环境的情况下运行其他实用程序。使用env,可以添加或删除变量,并通过为它们分配新值来更改现有变量。
关于你的问题:
在实践中,env还有另一种常见用法。它经常被shell脚本用来启动正确的解释器。在这种用法中,通常不会改变环境。
可以在这里找到更多关于env
的信息,同样也可以在终端中的man env
中查找。
关于shebang的额外信息;为什么#!python不起作用?
在评论中,有人问为什么我们不能简单地使用#!python作为shebang。由于解释器在$PATH中,这个想法是可以理解的。
原因是可执行文件是通过execve来执行的,我们可以在这里阅读到
here。具体来说,以下几行:
一个解释器脚本是一个启用了执行权限并且第一行形式为的文本文件:
#! interpreter [optional-arg]
解释器必须是一个有效的路径名,用于可执行文件....
解释说明了execve要求提供完整(有效)的解释器路径。这是有道理的,因为脚本(无论是哪种语言)可能在启动过程中的任何时刻运行,甚至可能在设置$PATH之前运行。
#!
,而不是#
。 - Dubu