gpt4 book ai didi

shell - 如何在shebang行中动态选择解释器?

转载 作者:行者123 更新时间:2023-12-04 05:14:46 27 4
gpt4 key购买 nike

我正在尝试编写一个从 shebang 行调用的脚本,并根据条件(在我的情况下,基于操作系统版本)返回正确的解释器,但我不明白为什么它不起作用。
我将尝试通过一个例子来澄清:
可执行文件1:/home/orens/dynamically_select_interpreter/select_interpreter.sh:

#!/usr/bin/env bash
echoerr() { echo "$@" 1>&2; }

interpreter=`cat /home/orens/dynamically_select_interpreter/interpreter`
if [ -z "$interpreter" ]; then
echoerr "Could not find interpreter!"
exit 1
fi

echoerr "Found interpreter: $interpreter"

exec "$interpreter" "$@"

这个脚本根据一些文件的内容选择解释器(在这种情况下,内容是: /usr/bin/python )。然后,它通过调用 exec 用正确的解释器替换自己。 .
从命令行调用它,这就是我得到的:
$ /home/orens/dynamically_select_interpreter/select_interpreter.sh
Found interpreter: /usr/bin/python
Python 2.4.3 (#1, Dec 10 2010, 17:24:35)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

但是,当我尝试在 shebang 行中使用它时,如下所示:
#!/home/orens/dynamically_select_interpreter/select_interpreter.sh


echo $SHELL # should be an error # LINE 1
import sys; print "HERE"; print sys.version # this is the actual error # LINE 2

该脚本作为 shell 脚本而不是 python 脚本执行。 LINE 1 执行正确,而 LINE 2 引发错误。看起来 shebang 行被默默地忽略了(甚至打印到 stderr 也没有显示在屏幕上)。

基本上,我正在尝试做与 env 相同的事情,但来自脚本。我想如果我用 C/C++ 编写它并编译我会得到我想要的,但是由于这个脚本将用作克服多内核版本情况的工具,我真的希望我的可执行文件是 OS-独立,我实现这一目标的唯一方法是通过脚本。

任何人都可以解释这种行为或帮助我解决它吗?

谢谢!

最佳答案

附加重定向是否有效取决于您的操作系统。您的示例(稍微简化,但想法保持不变)适用于我的 Debian 安装。但是一些操作系统在解释 shebang 行的方式上有限制,包括对命令长度、命令可能采用的参数数量等的限制。查看 this discussion对于某些示例 - 他们使用 PERL 但本质上尝试做与您相同的事情。 sourceforge 上有一个项目叫 shebang-wrapper这可能会有所帮助,但我还没有在实践中对其进行测试,它仍处于 pre-alpha 阶段。

关于shell - 如何在shebang行中动态选择解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14427516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com