2012-05-16 55 views
1

我有以下簡單的shell腳本:現在Bourne Shell:如何在內核命令返回非零退出代碼時終止?

# get all servers from config 
sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers` 

#for each server 
for server in sshservers 
do 

    #run deployserver with server (server:port format) argument 
    if ! sh deployserver --server $server 
    then 
     exit 1 #failure 
    fi 

done 

,節點命令獲得sshservers可能會返回一個退出碼,非零。當發生這種情況時,事情變得非常糟糕,所以我想退出一條錯誤消息。

我該怎麼做?這是最合適的方式嗎?

sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers` 
if ! $? 
then 
    echo "Error: node readconfig tool failed." 
    exit 1 
fi 

另外,當事情發生如此嚴重的錯誤時,如何輸出此節點命令的stderr?

最後,當sh deployserver失敗,或者應該以不同方式完成時,我退出的方式是什麼?

回答

2

要看到,如果最後一個命令是sucessfull你可以這樣做:

if [ "$?" != "0" ] 
    then 
     //do something 
    fi 

的標準錯誤應該找到它的方式對你本身運行腳本的控制檯。

1

使用$?,其中包含上次運行命令的退出代碼。所以,你可以這樣做:

sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers` 
[[ "$?" == "0" ]] || exit 1 

的方式從sh deployserver退出是我會做到這一點。如果你願意,你可以使用$?,但是你擁有它的方式更短,更乾淨恕我直言。

2

它看起來有點怪,但它是合法的事:

sshservers=$(node ...) || exit 1 

請注意,您不需要發出錯誤消息,因爲節點命令應該已打印診斷有用的錯誤之前,退出。您也可以簡單地在腳本開始處添加set -e,如果此表單的任何分配終止,將導致腳本中止。賦值的返回值是「內部」命令的返回值,所以正常的技巧都適用。

+0

是的,這是乾淨的,可以看到反映在Perl中的實踐。 – Xailor

1

你也可以把分配到if聲明:

if ! sshservers=$(node $scriptDir/readconfig.js --command cluster.sshservers) 
then 
    echo "oops, node command returned non-zero" 
    exit 1 
fi 

for server in $sshservers; do ... 
相關問題