参见英文答案 > What type of path in shebang is more preferable? 3个
我注意到一些python脚本以#!/usr/bin/env python而不是#!/usr/bin/python开头.
python脚本是唯一使用#!/usr/bin/env的脚本吗?是否有任何脚本以例如#!/usr/bin/env bash或#!/usr/bin/env perl开头?如果没有,那么为什么python脚本不同?
解决方法:
在脚本的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是/usr/bin中的可执行文件,或者如@hvd所述(感谢提示!),在几乎所有Linux发行版中都可以作为/usr/bin中的兼容性符号链接到env.
来自*:
env是Unix和类Unix操作系统的shell命令.它用于打印环境变量列表或在更改的环境中运行另一个实用程序,而无需修改当前现有的环境.使用env,可以添加或删除变量,并且可以通过为它们分配新值来更改现有变量.
并就你的问题而言:
在实践中,env有另一种常见用途. shell脚本经常使用它来启动正确的解释器.在此用法中,通常不会更改环境
关于env的更多信息可以在here找到,并且一如既往地在man env(来自终端).
有关shebang的其他信息;为什么不#!python工作?
在评论中,有人问我们为什么不能简单地使用#!python作为shebang.由于解释器在$PATH中,这个想法是可以理解的.
原因是execve执行可执行文件,因为我们可以阅读here.具体来说:
解释器脚本是一个启用了执行权限且第一行具有以下形式的文本文件:
#!解释器[optional-arg]
解释器必须是可执行文件的有效路径名….
解释说execve需要一个完整(有效)的解释器路径.这是有道理的,因为脚本(用任何语言)可以例如在启动期间的任何时刻都可以运行,可能在$PATH设置之前.