【问题标题】:bash ignores shebang when running file passed as argumentbash 在运行作为参数传递的文件时忽略 shebang
【发布时间】:2022-01-24 04:40:49
【问题描述】:

在将文件作为参数传递时,如何让 bash 尊重 shebang?

例如: hello.py

#!/usr/bin/env python
print("Hello Python")

当传递给 bash:

$ bash hello.py
hello.py: line 2: syntax error near unexpected token `"Hello Python"'
hello.py: line 2: `print("Hello Python")'

不幸的是,在我使用的环境中,我无法直接执行 hello.py,它必须通过向 bash 提供 args 来完成。

【问题讨论】:

  • 当然 Bash 会忽略它,它是一个注释; shebangs 适用于内核。你想运行/usr/bin/env python hello.py,对吗?只是想确定一下,因为我还可以想象带有更具描述性的错误消息的 Bash 错误是另一种选择。
  • bash SOMEFILESOMEFILE 作为 bash 脚本执行。这在 bash 手册页中有描述。您可以写 bash -c ./hello.py 来强制使用 #!正在考虑的行(假设 hello.py 是可执行的),但这会创建一个额外的(不必要的)子进程,因为您可以通过 ./hello.py 来同样好地运行它。

标签: bash shebang


【解决方案1】:

不要使用显式解释器运行脚本。始终只需键入脚本名称即可执行它们;这样就会使用 shebang 中列出的解释器。

$ ./hello.py

这将要求脚本是可执行的,所以如果您还没有这样做,请确保这样做。

$ chmod +x hello.py

如果您必须运行 bash,则使用 -c 传递完整命令并阻止它尝试将其作为 bash 脚本读取:

$ bash -c './hello.py'

【讨论】:

  • 如果我有交互式访问我会的,但在我使用的环境中,我只能将 args 传递给 bash。我希望找到一些可以触发 bash 来选择 shebang 解释器的组合,但也许这是不可能的?
最近更新 更多