shebang 总是和解释器的安装目录一样吗?

avi*_*wal 1 linux python executable shebang interpreter

shebang 标头必须始终与解释器的安装目录匹配吗?如果是这样,那么为什么既#!/usr/bin/python#!/usr/local/bin/python我的工作?

jwd*_*jwd 7

正如其他人所指出的,shebang 行必须引用存在的实际文件。

由于不同的系统可以将二进制文件安装到不同的位置,这是脚本可移植性的弱点。

正如其他人提到的那样,解决此问题的一种方法是使用链接。

另一种方法是编辑脚本以引用系统上的正确路径。

解决此问题的另一种方法是使用/usr/bin/env,它将在您的 PATH 中找到可执行文件。

所以而不是:

#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

写:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

这样,人们只需要/usr/bin/env在需要时进行符号链接,而不是每个单独的可执行文件。

当然,可执行文件仍然必须在你的 PATH 中才能工作......

如您所见,没有 100% 清洁的解决方案。请记住:“越差越好”(:


der*_*ert 5

#!(家当)线必须指定一个实际存在的可执行文件。如果两者都在您的系统上运行,则意味着您在两个地方都安装了 python。或者,可能是一个符号链接。

通常,您会在尝试使用不存在的解释器时遇到错误:

anthony@Zia:~$ /tmp/test 
bash: /tmp/test: /usr/local/bin/python: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果您改为像这样运行脚本,那么路径可能无关紧要:

anthony@Zia:~$ python /tmp/test
anthony@Zia:~$ 
Run Code Online (Sandbox Code Playgroud)

那是因为您正在直接运行 python,并向它传递一个参数。然后 Python 决定打开该文件并将其视为脚本。在第一种情况下,内核试图将脚本作为可执行文件运行。它会检查它,注意到shebang 行,并尝试将其转换为第二种形式,因此它实际上可以运行它。如果后面给出的路径#!实际上不存在,则失败。