相对shebang:如何编写一个运行便携式解释器的可执行脚本

时间:2015-10-19 22:35:34

标签: python linux shell unix shebang

假设我们有一个程序/包,它附带了自己的解释器和一组脚本,这些脚本应该在执行时调用它(使用shebang)。

让我们说我们想让它保持便携,所以即使只是简单地复制到不同的位置(不同的机器)而不调用设置/安装或修改环境(PATH)它仍然可以运行。不应混淆系统解释器用于这些脚本。

给定的约束排除了两种已知方法,例如具有绝对路径的shebang:

#!/usr/bin/python 

并在环境中搜索

#!/usr/bin/env python

单独的发射器看起来很丑,不可接受。

我找到了shebang限制的很好的总结,这些限制描述了为什么shebang中的相对路径是无用的并且解释器不能有多个参数:http://www.in-ulm.de/~mascheck/various/shebang/

我还发现practical solutions对于大多数使用'多线shebang'招数。它允许编写如下脚本:

#!/bin/sh
"exec" "`dirname $0`/python2.7" "$0" "$@"
print copyright

但有时候,我们并不想扩展/修补依赖shebang的现有脚本,并使用这种方法获得解释器的绝对路径。例如。 Python的setup.py支持--executable选项,它基本上允许为它生成的脚本指定shebang内容:

python setup.py build --executable=/opt/local/bin/python

因此,特别是,为了实现所需的可移植性,可以为--executable=指定什么?换句话说,因为我想保持这个问题不太具体到Python ......

问题

如何编写一个shebang,它指定一个解释器,其路径相对于正在执行的脚本的位置?

1 个答案:

答案 0 :(得分:3)

直接写在shebang中的相对路径是相对于当前工作目录处理的,因此#!../bin/python2.7之类的东西不适用于除少数之外的任何其他工作目录。

由于操作系统不支持,为什么不使用外部程序,例如使用env进行PATH查找。但我知道没有专门的程序可以计算参数的相对路径并执行结果命令..除了shell本身和其他脚本引擎。

但是尝试在像

这样的shell脚本中计算路径
#!/bin/sh -c '`dirname $0`/python2.7 $0'

不起作用,因为在Linux上shebang仅受一个参数的限制。这建议我寻找脚本引擎,它接受一个脚本作为命令行的第一个参数,并且能够执行新的进程:

使用AWK

#!/usr/bin/awk BEGIN{a=ARGV[1];sub(/[a-z_.]+$/,"python2.7",a);system(a"\t"ARGV[1])}

使用Perl

#!/usr/bin/perl -e$_=$ARGV[0];exec(s/\w+$/python2.7/r,$_)