我注意到一些 Python 脚本以
#!/usr/bin/env python
代替
#!/usr/bin/python
只有 Python 脚本使用 吗?是否有脚本以或#!/usr/bin/env
开头?如果没有,那么为什么 Python 脚本不同?#!/usr/bin/env bash
#!/usr/bin/env perl
答案1
在脚本的 shebang 中使用 env
在这一点上,Python 脚本与任何其他语言的脚本没有什么区别。
如果#!/usr/bin/env python
脚本#!/usr/bin/python
是可执行文件,并在没有前面的语言的情况下调用。然后,脚本调用语言的解释器来运行脚本内的代码,而 shebang 就是在您的示例中查找的“指南” python
。
使用#!/usr/bin/env python
而不是绝对路径(完整路径)#!/usr/bin/python
可以确保找到 python(或任何其他语言的解释器),以防它在不同的 Linux 或类 Unix 发行版中可能不位于完全相同的位置,如下所述这里。
虽然#!/usr/bin/python
可以在默认的 Ubuntu 系统上运行,但最好使用它 #!/usr/bin/env python
。
关于 env
env
是可执行文件/usr/bin
,或者正如@hvd 所述(感谢提示!),在几乎所有的 Linux 发行版中,都可以作为/usr/bin
中的兼容符号链接使用。env
从维基百科:
env 是 Unix 和类 Unix 操作系统的 shell 命令。它用于打印环境变量列表或在更改的环境中运行另一个实用程序,而无需修改当前存在的环境。使用 env,可以添加或删除变量,也可以通过为现有变量分配新值来更改它们。
关于你的问题:
在实践中,env 还有另一种常见用途。它通常被 shell 脚本用来启动正确的解释器。在这种用法中,环境通常不会改变
更多详情env
请见这里,并且像往常一样,在man env
(从终端)。
关于shebang的附加信息;为什么#!python 不起作用?
在评论中,有人问为什么我们不能简单地将其用作#!python
shebang。由于解释器位于中$PATH
,因此这个想法是可以理解的。
原因是可执行文件是由执行的execve
,我们可以读到这里. 具体来说:
解释器脚本是一个启用了执行权限的文本文件,其第一行格式如下:
#! interpreter [optional-arg]
翻译人员必须是 有效路径名 对于可执行文件....
解释execve
器要求提供完整(有效)路径。这很有意义,因为脚本(任何语言)都可以在启动期间的任何时刻运行,甚至可能在$PATH
设置之前运行。
答案2
Jacob 的回答解释得很好。不过我还想提一点。
在 Python 中使用/usr/bin/env/
还有另一个目的。因为 Python 支持虚拟环境,使用/usr/bin/env python
将确保您的脚本在虚拟环境中运行(如果您在虚拟环境中)。而/usr/bin/python
将在虚拟环境之外运行。
答案3
除了上面给出的答案之外,使用/usr/bin/env
允许将 Python 安装在非标准位置,只要PATH
正确设置,脚本就可以在任何具有 的 UNIX 样式系统上不加修改地运行/usr/bin/env
。这包括任何现代版本的 Linux 和 OS/X。