shebang 标头必须始终与解释器的安装目录匹配吗?如果是这样,那为什么两者都为我工作呢#!/usr/bin/python
?#!/usr/local/bin/python
答案1
正如其他人所指出的,shebang 行必须引用存在的实际文件。
由于不同的系统可以将二进制文件安装到不同的位置,因此这是脚本可移植性的弱点。
正如其他人提到的,解决此问题的一种方法是使用链接。
另一种方法是编辑脚本以引用系统上的正确路径。
解决此问题的另一种方法是使用/usr/bin/env
,它将在您的 PATH 中找到可执行文件。
所以而不是:
#!/usr/bin/python
写:
#!/usr/bin/env python
这样,人们只需/usr/bin/env
在需要时进行符号链接,而不是每个单独的可执行文件。
当然,可执行文件仍然必须位于您的 PATH 中才能正常工作......
如您所见,不存在 100% 干净的解决方案。请记住:“越差越好”(:
答案2
(shebang)行#!
必须指定实际存在的可执行文件。如果两者都在您的系统上运行,则意味着您在两个地方都安装了 python。或者,可能是一个符号链接。
通常,您会收到尝试使用不存在的解释器的错误:
anthony@Zia:~$ /tmp/test
bash: /tmp/test: /usr/local/bin/python: bad interpreter: No such file or directory
如果您像这样运行脚本,那么路径可能并不重要:
anthony@Zia:~$ python /tmp/test
anthony@Zia:~$
那是因为你直接运行 python,并向它传递一个参数。然后,Python 决定打开该文件并将其视为脚本。在第一种情况下,内核尝试将脚本作为可执行文件运行。它会检查它,注意到 shebang 行,并尝试将其转换为第二种形式,以便它可以实际运行它。如果后面给出的路径#!
实际上不存在,则失败。
答案3
Shebang 是以下字符的组合:#!
当它出现在脚本的第一行时。下面的字符串始终是解释器的路径。我会检查到底/usr/bin/python
是什么/usr/local/bin/python
。其中一个可能是另一个的符号链接。您能否提供以下命令的输出:
ls -l /usr/bin/python
ls -l /usr/local/bin/python