2016-09-09 28 views
2

我等製成的bash腳本script.sh的bash執行整個腳本,只是返回退出代碼> 0,如果任何中間作業失敗

./step1.sh 
./step2.sh 
./step3.sh 

每個步驟的* .h腳本返回正確的錯誤代碼,他們是否失敗或不。

現在,如果step3.sh失敗,我得到一個相應的退出代碼,但如果任step1.sh或step2.sh失敗,step3.sh成功,比我拿到狀態= 0,這是不理想的。

我知道我可以使用

set -e 

在我的腳本的頂部,使如有的中間步驟失敗腳本失敗,但是這不是我想要的。

我想知道是否有一個簡單的選項可用於執行每個中間腳本(即使其中一個失敗),但返回退出代碼> 0,如果其中任何一個失敗而不必跟蹤每個人手動退出代碼。

+0

爲什麼你不想使用'設置-e',什麼是你想要的預期的行爲?如果step2.sh'失敗,應該繼續運行'step3.sh'嗎? – ffledgling

+0

如何爲每一箇中間步驟失敗,@ffledgling是每一箇中間步驟應保持運行 –

+0

設定不同的位不是這基本上是保持手動跟蹤每個退出代碼,即正是OP說,他不希望去做? – lucacerone

回答

4

您可以捕獲錯誤:

#!/bin/bash 

echo "test start." 

trap 'rc=$?' ERR 

./error.sh 
./script2.sh 

echo "test done." 
return ${rc} 
在陷阱是如何工作的

欲瞭解更多信息,請參閱trap

0

你可以這樣做:

#!/bin/bash 

# array with all the scripts to be executed 
arr=(./step1.sh ./step2.sh ./step3.sh) 

# initialize return status to 0 
ret=0 

# run a loop to execute each script 
for i in "${arr[@]}"; do 

    echo "running $i" 
    bash "$i" 
    ret=$((ret | $?)) # return status from previous step bitwise OR with current status 

done 

echo "exiting with status: $ret" 

exit $ret 
+3

一個整數 – ffledgling

+1

我相信OP希望執行所有步驟,而不考慮每個步驟的退出狀態,但仍然希望在任何步驟失敗時退出失敗。 – anubhava

+1

@anubhava這正是我想要的,我想要做的。但我想知道是否有任何可以手動跳過檢查的選項。無論如何我喜歡你的解決方案! – lucacerone

0

我知道你說你不想有維護每一個退出代碼,但是這其實很容易用數組做:

declare -a rcs 
./step1.sh ; rcs+=($?) 
./step2.sh ; rcs+=($?) 
./step3.sh ; rcs+=($?) 

然後,您可以簡單地循環訪問數組,並根據需要尋找第一個(或最大,最後,平均,總和等)錯誤代碼。下面的代碼演示如何做到這回遇到的第一錯誤:

for ((idx = 0; idx < ${#rcs[@]}; idx++)); do 
    [[ ${rcs[$idx]} -ne 0 ]] && return ${rcs[$idx]} 
done 
return 0 

同樣,得到最大錯誤:

rc=0 
for ((idx = 0; idx < ${#rcs[@]}; idx++)); do 
    [[ ${rcs[$idx]} -gt $rc ]] && rc=${rcs[$idx]} 
done 
return $rc 
+0

您是否提交此代碼混淆比賽? – dood

+0

@dood:不錯的一個。不幸的是,大多數人只使用「bash」的最小部分,而沒有意識到其真正的力量。任何擁有C語言知識的人都應該理解這一點。如果沒有,這是一個很好的學習機會:-) – paxdiablo

0

熬煮絕對基礎,

rc=0 
./step1 || rc=$? 
./step2 || rc=$? 
./step3 || rc=$? 
exit $rc 
+0

OP不希望「手動跟蹤每個個人退出代碼」顯然。 – dood

+0

我忘了'.sh'的擴展名,因爲通常不是一個好主意。根據你的標籤,這些是Bash腳本,而不是'sh'腳本;並且對擴展進行硬編碼意味着您不能用另一種語言重新實現來替換該命令(並且仍保留相同的文件名,並保留誠實)。 – tripleee

+0

@dood我們沒有跟蹤,我們覆蓋了一個錯誤的情況。但是,是的,我upvoted你的答案已經( - : – tripleee

相關問題