为什么我们不使用 #!command 作为 shebang 行?

为什么我们不使用 #!command 作为 shebang 行?
#!python3
print("Hello")

我发现这段代码在我的终端中运行良好。但每个人都这样做#!/path/to/file#!/usr/bin/env command

有什么理由避免#!command在 shebang 行中使用?

答案1

一般情况下,无路径 shebang 假定 shebang 中的命令位于当前目录中。更一般地说,非绝对 shebang 是相对于执行脚本的进程的当前目录来解释的。

命令不在当前目录中的无路径 shebang 仅当从某些 shell(至少是 Zsh,但不是 Bash)启动脚本时才起作用,并且它之所以起作用是因为 shell 提供了帮助。当脚本运行时,执行失败,但是当时的规则是如果 shell 认为它是一个脚本,则尝试运行该脚本; Zsh 在其路径中查找 shebang 命令,但这不是标准的。

具有无路径 shebang 命令的脚本将无法在任何其他上下文中运行。

编写PATH基于 - 的 shebang 的惯用方法是使用/usr/bin/env,正如您提到的:

#! /usr/bin/env python3

或者,对于某些版本env

#! /usr/bin/env -S python3 --

以避免以破折号开头的脚本路径出现问题。

相关内容