2013-11-20 83 views
14

我嘗試構建可隨時隨地工作的腳本。爲此,我使用一個定製的python,它總是在相對於腳本的父目錄中。shebang:使用相對於腳本路徑的解釋器

這樣我就可以將我的軟件包加載到U盤上,並且無論在哪裏安裝,以及是否安裝了python,它都可以在任何地方使用。

然而,當我使用

#!../python 

那麼它的工作原理,只有當該腳本會從它的目錄,這當然是不能接受的調用。

有沒有辦法做到這一點或在目前的shebang機制是不可能的?

回答

9

有一個健康的一套多行家當腳本上this page了很多的語言,例如:

#!/bin/sh 
"exec" "`dirname $0`/python" "$0" "[email protected]" 
print copyright 

如果你想要一個行家當,this answer(和問題)解釋了這個問題細節和使用家當內其它腳本提出以下方法:

使用AWK

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

使用Perl

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

對於其他人誰找到這個問題的同時,尋找一個便攜式解決方案蟒蛇hashbang線,並找到AWK命令上面不傳遞多個參數工作,改用以下。

#!/usr/bin/awk BEGIN{a=ARGV[1];b="";for(i=1;i<ARGC;i++){b=b" \""ARGV[i]"\"";}sub(/[a-z_.\-]+$/,"python",a);system(a"\t"b)} 

要更改當前目錄中的所有腳本hashbang行,您可以執行以下操作。

sed -i '1 s|^#!.*|#!/usr/bin/awk BEGIN{a=ARGV[1];b="";for(i=1;i<ARGC;i++){b=b" \""ARGV[i]"\"";}sub(/[a-z_.\-]+$/,"python3.5",a);system(a"\\t"b)}|' *