2013-10-09 99 views
0

從/ usr/local/bin目錄/ ERL

ROOTDIR=/usr/local/lib/erlang 
BINDIR=$ROOTDIR/erts-5.9.1/bin 
EMU=beam 
PROGNAME=`echo $0 | sed 's/.*\///'` 
export EMU 
export ROOTDIR 
export BINDIR 
export PROGNAME 
exec $BINDIR/erlexec ${1+"[email protected]"} 

我知道 「$ @」 meams參數。但{1 +「$ @」}意味着什麼?

+1

請參閱http://unix.stackexchange.com/questions/68484/what-does-1-mean-in-a-shell-script-and-how-does-it-differ-from – devnull

+1

這是一個時代錯誤。你可以(也應該)只使用'「$ @」'代替。 –

+2

...另外,不要引用'$ BINDIR'是一個錯誤,因爲沒有引用'$ 0',並且使用sed而不是參數擴展是愚蠢的。不要把它當作代碼來模擬。 –

回答

4

從IEEE標準1003.1(POSIX 2013),Shell command language

${parameter:+[word]} 

使用替代的價值。如果參數未設置或爲null,則應置換null;否則,詞的擴展(或者如果詞被省略,則爲空字符串)將被替換。

即,${1+"[email protected]"}膨脹到的"[email protected]"的值,該命令行參數,當沒有設置$1除,即沒有命令行參數,在這種情況下,表達什麼也不擴展。更簡單的腳本,顯示這是如何工作的

echo '"' ${1+"[email protected]"} '"' 

如果這些信息存儲在一個文件test.sh並運行它,你就會得到:

/tmp$ sh test.sh 
" " 
/tmp$ sh test.sh 1 
" 1 " 
/tmp$ sh test.sh 1 2 
" 1 2 " 

(該在空間的開始和結束都來自echo。 )

+0

這與'echo'「'$ @'」''有什麼不同? –

+1

Magnus,非常不同 - '「$ @」'使用原始分詞,而不帶引號的'$ @'的行爲就像'$ *';在'「$ @」中雙引號是句法的,而在你的例子中它們是數據。 –

+0

啊,那麼,我想我想問的是,'$ {1 +「$ @」}'與$「」有什麼不同?這似乎已經由威廉Pursell回答。 –

4

larsmans提供了對語義的解釋,但沒有說明爲什麼${1+"[email protected]"}與簡單"${@}"不同。在正常運行的shell中,「$ {@}」擴展爲無。即:如果「$ @」爲空,foo "[email protected]"應該調用foo而不帶參數。在錯誤行爲的shell中,將使用一個參數(空字符串)調用foo "[email protected]"。許多歷史shell將「$ @」擴展爲空字符串而不是無用,但${1+"[email protected]"}正確擴展爲無。

+1

......要清楚,那就是POSIX不兼容的歷史shell ;今天沒有必要擔心現代外殼中的這個缺陷。 –

+0

確實,這似乎是[真正的Bourne shell的解決方法](http://unix.stackexchange.com/questions/68484/what-does-1-mean-in-a-shell-script-and-how -does-IT-不同-從)。 –