Python的shebang行

8
我看到一些人在使用 shebang 行时在 env 后面加了一个空格。例如:
#!/usr/bin/env python

这是一个笔误吗?
我从不使用空格。我使用
#!/usr/bin/env/python

请问有人能解释一下吗?

具体来说:https://dev59.com/W3E95IYBdhLWcg3wKqsk#6769343 - user3483203
那根本不是格式错误的shebang。 - user3483203
1
这两者有什么区别呢? - PandaSurge
2
在任何*nix系统上,都可以使用shebang #!/usr/bin/env/python吗? - Aran-Fey
1
我不确定我是否同意你提供的链接,因为我不清楚那个问题是在询问一般的 shebang 还是特指带有 /usr/bin/env 的 shebang。对我来说看起来不太清楚。 - Aran-Fey
显示剩余6条评论
2个回答

9

不,这不是打错字!你正在使用的那个命令在所有操作系统上都不起作用。例如,在我的Ubuntu Linux实现中,“env”是一个程序,而不是一个目录,因此“#!/usr/bin/env/python”将无法正常工作。


7
不使用空格不是错别字,但在在不同的机器上执行相同的文件时会导致可移植性问题。shebang行(#!/usr....)的目的是指示在执行文件中的代码时要使用哪个解释器。根据Wikipedia的说法:
引导解释器指令的形式如下: #!interpreter [optional-arg] 其中解释器是可执行程序的绝对路径。可选参数是表示单个参数的字符串。
您提供的示例#!/usr/bin/env python实际上表明当执行文件时要使用的解释器是用户路径中存在的第一个python解释器。编写这种方式的shebang行是为了确保可移植性:
Shebang必须指定系统可执行文件的绝对路径(或相对于当前工作目录的路径);这可能会在具有非标准文件系统布局的系统上导致问题。即使系统具有相当标准的路径,同一操作系统的变体也很可能具有所需解释器的不同位置。例如,Python可能位于/usr/bin/python、/usr/local/bin/python,甚至像/home/username/bin/python这样的普通用户安装的位置。
因此,在从一台计算机复制脚本到另一台计算机后,有时需要编辑shebang行,因为编码到脚本中的路径可能不适用于新机器,这取决于过去约定放置解释器的一致性。出于这个原因和因为POSIX没有标准化路径名,POSIX没有标准化这个特性。
通常,程序/usr/bin/env可以用来绕过这个限制,引入一个间接级别。#!后面跟着/usr/bin/env,然后是所需的命令而不是完整路径,如下例所示:
#!/usr/bin/env sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接