2014-06-30 144 views

回答

0
#! /bin/sh 
# try executing this script with several arguments to see the effect 

test ".$INNERCALL" = .YES || { 
    export INNERCALL=YES 
    # this method works both for shell and bash interpreters 
    sh -c ". '$0'" argv0new "[email protected]" 
    exit $? 
} 

printf "argv[0]=$0\n" 
i=1 ; for arg in "[email protected]" ; do printf "argv[$i]=$arg\n" ; i=`expr $i + 1` ; done 
+3

有幾種方法可以改善這個答案。對發生的事情進行一些解釋會有所幫助。你可以使用'INNERCALL = YES exec sh -c'。'$ 0'「argv0new」$ @「'使內部調用代碼更簡潔。我有點懷疑是否有辦法打破''。 '$ 0'命令,但是我可以立即想到的技術需要足夠的不尋常的設置,我可以把它放在一邊。但沒有解釋,我不認爲這是一個好的答案。 –

+0

@JonathanLeffler任何軟件運行良好。源代碼是最好的解釋;) – sqrt163

+0

顯然不是。看到這個後續問題:https://stackoverflow.com/questions/48407615/how-to-change-argv0-value-using-bash-shell-explanation-required – tripleee

1

這是另一種方法。它是通過直接執行命令來實現的,這比執行命令(點命令)要好一些。但是,這種方法僅適用於shell解釋,沒有慶典,因爲SH支持-s選項-c一起傳遞:

#! /bin/sh 
# try executing this script with several arguments to see the effect 

test ".$INNERCALL" = .YES || { 
    export INNERCALL=YES 
    cat "$0" | /bin/sh -s -c : argv0new "[email protected]" 
    exit $? 
} 

printf "argv[0]=$0\n" 
i=1 ; for arg in "[email protected]" ; do printf "argv[$i]=$arg\n" ; i=`expr $i + 1` ; done 

的這兩個例子的情況下./the_example.sh 1 2 3預期結果應該是:

argv[0]=argv0new 
argv[1]=1 
argv[2]=2 
argv[3]=3 
+0

奇怪的是,如果你把所有'/ bin/sh'改成'/ bin/bash',它就會停止工作。這是在Ubuntu 16.04 LTS安裝上。不知何故,在某些時候,Linux上帝選擇讓/ bin/sh成爲一些「破折號」,並不等於/ bin/bash。所選答案http://stackoverflow.com/a/24581562/257924沒有這個問題。 – bgoodr

+0

@bgoodr你讀過這個答案的三維句子嗎? – sqrt163

+0

同意。如果我清楚地閱讀了這句話,我沒有這樣做,「因爲sh支持」應該允許我在這種情況下將「shell解釋器」解釋爲「/ bin/sh」解釋器。 – bgoodr