shebang 总是与解释器的安装目录相同吗?

shebang 总是与解释器的安装目录相同吗?

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

相关内容