假设我们有一个程序/包,它附带了自己的解释器和一组脚本,这些脚本应该在执行时调用它(使用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,它指定一个解释器,其路径相对于正在执行的脚本的位置?
答案 0 :(得分:3)
直接写在shebang中的相对路径是相对于当前工作目录处理的,因此#!../bin/python2.7
之类的东西不适用于除少数之外的任何其他工作目录。
由于操作系统不支持,为什么不使用外部程序,例如使用env
进行PATH
查找。但我知道没有专门的程序可以计算参数的相对路径并执行结果命令..除了shell本身和其他脚本引擎。
但是尝试在像
这样的shell脚本中计算路径#!/bin/sh -c '`dirname $0`/python2.7 $0'
不起作用,因为在Linux上shebang仅受一个参数的限制。这建议我寻找脚本引擎,它接受一个脚本作为命令行的第一个参数,并且能够执行新的进程:
#!/usr/bin/awk BEGIN{a=ARGV[1];sub(/[a-z_.]+$/,"python2.7",a);system(a"\t"ARGV[1])}
#!/usr/bin/perl -e$_=$ARGV[0];exec(s/\w+$/python2.7/r,$_)