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 SOMEFILE
将 SOMEFILE 作为 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的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉python在将命令传递给bash时忽略一个字符(Python到bash命令SyntaxError:因为{而无效的语法)