bash 在运行作为参数传递的文件时忽略 shebang

Posted

技术标签:

【中文标题】bash 在运行作为参数传递的文件时忽略 shebang【英文标题】:bash ignores shebang when running file passed as argument 【发布时间】: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 来同样好地运行它。 【参考方案1】:

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

$ ./hello.py

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

$ chmod +x hello.py

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

$ bash -c './hello.py'

【讨论】:

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

以上是关于bash 在运行作为参数传递的文件时忽略 shebang的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中传递 -e 和 -n 作为位置参数

如何告诉python在将命令传递给bash时忽略一个字符(Python到bash命令SyntaxError:因为{而无效的语法)

在bash中将数组作为参数传递

如何将“=”作为参数的一部分从 Windows 的 bit-bash 传递给 .cmd 或 .bat 文件

在BASH中将日期作为STDIN传递给ruby函数[关闭]

BASH - 如果没有命令行参数作为参数传递,则抛出使用警告