我嘗試構建可隨時隨地工作的腳本。爲此,我使用一個定製的python,它總是在相對於腳本的父目錄中。shebang:使用相對於腳本路徑的解釋器
這樣我就可以將我的軟件包加載到U盤上,並且無論在哪裏安裝,以及是否安裝了python,它都可以在任何地方使用。
然而,當我使用
#!../python
那麼它的工作原理,只有當該腳本會從它的目錄,這當然是不能接受的調用。
有沒有辦法做到這一點或在目前的shebang機制是不可能的?
我嘗試構建可隨時隨地工作的腳本。爲此,我使用一個定製的python,它總是在相對於腳本的父目錄中。shebang:使用相對於腳本路徑的解釋器
這樣我就可以將我的軟件包加載到U盤上,並且無論在哪裏安裝,以及是否安裝了python,它都可以在任何地方使用。
然而,當我使用
#!../python
那麼它的工作原理,只有當該腳本會從它的目錄,這當然是不能接受的調用。
有沒有辦法做到這一點或在目前的shebang機制是不可能的?
有一個健康的一套多行家當腳本上this page了很多的語言,例如:
#!/bin/sh
"exec" "`dirname $0`/python" "$0" "[email protected]"
print copyright
如果你想要一個行家當,this answer(和問題)解釋了這個問題細節和使用家當內其它腳本提出以下方法:
#!/usr/bin/awk BEGIN{a=ARGV[1];sub(/[a-z_.]+$/,"python",a);system(a"\t"ARGV[1])}
#!/usr/bin/perl -e$_=$ARGV[0];exec(s/\w+$/python/r,$_)
對於其他人誰找到這個問題的同時,尋找一個便攜式解決方案蟒蛇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)}|' *