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

egr*_*grr 4 shell bash shebang

#!python3
print("Hello")
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*itt 13

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

\n

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

\n

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

\n

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

\n
#! /usr/bin/env python3\n
Run Code Online (Sandbox Code Playgroud)\n

或者,对于某些版本env

\n
#! /usr/bin/env -S python3 --\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

  • @DanielWalker Zsh 确实如此,但这不是标准的。 (2认同)