来自shell变量的shebang脚本解释器

时间:2013-01-24 10:04:48

标签: bash shell

我有许多脚本需要指定运行它们的python二进制文件:

#! /home/nargle/python/bin/python2.6

我需要调整这些脚本以在两个不同的站点上工作。许多工具安装在不同的地方,因此在新的站点2,脚本需要从以下开始:

#! /user/nargle/python/bin/python2.6
..

我想用直接引用的路径替换为每个站点设置不同的环境变量。我想要的是:

#! $MY_PYTHON_PATH

但它没有!我对哪里研究这个有点朦胧。它是检测'#!'的执行shell(无论是bash,csh还是其他)在脚本的开头(是bash,python还是其他)并启动解释器/ shell来运行它?

我觉得必须有某种方法可以做到这一点。请指教!

哦,是的,还有一个限制因素:我们无法使用此的路径。这似乎是一个愚蠢的限制,但这适用于拥有众多用户的大型环境

环境是RHEL 5.7。

编辑有人建议使用shell脚本,这是当前的计划:它工作正常:

 $MY_PYTHON_PATH some_script file.py $@

问题是我们有很多人使用python文件,还有很多需要更改的自动化测试。如果必须这样做,必须要做,但如果可能,我想尽量减少改变工作实践对数十人的影响。

编辑还可以在两个系统上的位置相同的链接,并链接到每个系统上不同目标中的真实二进制文件。这是非常可行但似乎有点混乱:我们使用linux'modules'包来为许多工具设置环境变量,如果我们可以从我们的模块文件中获取python路径,这将是很好的。

编辑这不是答案,但这感觉就像我正在寻找的那种邪恶的黑客: http://docs.nscl.msu.edu/daq/bluebook/html/x3237.html ..请参阅“示例4-2。用于bash和tclsh的#!行”

编辑我希望这可行,但事实并非如此:

!# /usr/bin/env PATH=$PATH:$MY_PYTHON_PATH python2.6

4 个答案:

答案 0 :(得分:5)

常见的解决方案是将shebang改为

#!/usr/bin/env python2.6

然后,只需将$ PATH安排在每台机器上指向正确的python2.6。

答案 1 :(得分:2)

编写包装器shell脚本。如果您有script.py,请使用以下内容撰写script.py.sh

#!/bin/bash
PYTHON_SCRIPT=$( echo "$0" | sed -e 's/\.sh$//' )
exec $MY_PYTHON_PATH $PYTHON_SCRIPT "$@"

免责声明:这不是经过测试的,只是把它写在了我的头顶。

现在只需在每台计算机上设置MY_PYTHON_PATH,然后拨打script.py.sh而不是script.py

摘要此解决方案仅次于最佳,因为它需要将大量脚本调用从script.py更改为script.py.sh,如果在一切皆有可能。


替代

使用env调用python-finder脚本,该脚本只调用$MY_PYTHON_PATH中包含的python二进制文件。 python-finder脚本必须位于两台机器上的相同位置,必要时使用符号链接。

#!/usr/bin/env /usr/local/bin/python-finder.sh

python-finder.sh的内容:

#!/bin/bash
exec $MY_PYTHON_PATH "$@"

这是有效的,因为对于解释器脚本(以shebang开头的那些)execve调用解释器并将文件名传递给env,env又将其传递给它调用的命令。

答案 2 :(得分:0)

我很傻:使用env进行变量扩展确实有用。

#! /usr/bin/env PATH="$PATH:$MY_PYTHON_PATH" python2.6

答案 3 :(得分:0)

我们可以这样做:

#!/bin/bash
"exec" "python" "$0"

print "Hello World"

来自http://rosettacode.org/wiki/Multiline_shebang#Python