2016-09-29 193 views
1

我的bash腳本(init.sh)調用另一個腳本(script.sh),我想在init.sh做任何進一步的行動之前,從script.sh測試誤碼測試錯誤代碼。
我想和$?測試它,但它不工作在bash腳本,從一個叫腳本

init.sh是這樣的:

#!/bin/bash 
set -e 
echo "Before call" 
docker run -v $PWD:/t -w /t [command] 
if [ $? == 1 ]; then 
     echo "Issue" 
fi 
echo "After call" 

我只能從stdout,而不是After call得到了Before call

我知道一個事實,如果我錯了與執行參數單獨docker run -v $PWD:/t -w /t [command],然後echo $?將正確地顯示1

我在想,我不從scrip.sh趕上退出代碼,而是從別的地方。

任何想法?

+1

這很混亂......你提到'script.sh',但不要在你的'init.sh'中調用它。無論如何,你可以嘗試運行'bash -x init.sh'並看看它實際上在做什麼。 – gilez

+1

使用'set -e',如果對'docker' *的調用將'$?'設置爲1,您的腳本將在'if'語句執行之前退出,更不用說最後的'echo'調用。 – chepner

回答

2

你運行該腳本set -e。這意味着如果任何命令以非零狀態退出,bash將停止執行所有後續行。因此,在這裏,如果docker以狀態1退出,則下面的條件根本沒有機會運行。試試這個:

#!/bin/bash 
set -e 
echo "Before call" 
if ! docker run -v $PWD:/t -w /t [command]; then 
     echo "Issue" 
fi 
echo "After call" 

這將運行如果測試其抑制了set -e我上述的效果,讓你有機會捕獲錯誤裏面的命令。注意這也將捕獲所有非零狀態,不僅僅是1.

+0

感謝**非常有價值的信息。它已經完成了! – Mornor

+0

'set -e' [*通常不是一個好主意](http://mywiki.wooledge.org/BashFAQ/105)。 – chepner

+0

@chepner你是對的。事實上,我想這個問題本身就是一個例子。 – redneb

1

擊數值比較運算符是-eq,而不是== ...
所以:

#!/bin/bash 
set -e 
echo "Before call" 
docker run -v $PWD:/t -w /t [command] 
if [ $? -eq 1 ]; then 
     echo "Issue" 
fi 
echo "After call" 
+0

這當然是一個好點。我試過了,失敗了:( – Mornor

+0

它有點不相關;沒有任何'$?'可能會導致'$?-eq 1'和'$?= 1'的值(使用''帶''[ ',而不是'==')表現不同。 – chepner

+0

@Mornor:爲什麼失敗?因爲該命令沒有以'-1'退出?或者爲什麼?你應該回聲$'的價值?',以測試它的價值... – MarcoS

1

set -e通常是一個壞主意。當然,在出現意外錯誤的情況下讓腳本自動退出似乎是個不錯的主意,但問題在於set -e,並且您可能對構成致命錯誤的內容有不同的看法。

相反,請自行處理錯誤。

#!/bin/bash 
echo "Before call" 
docker run -v $PWD:/t -w /t [command] 
docker_status=$? 
if [ $docker_status != 0 ]; then 
    echo "docker returned: $docker_status" 
    exit $docker_status 
fi 
echo "After call" 

在這個簡單的代碼,我已經有點冗餘的$?的價值首先保存到另一個變量。這可以確保在開始執行其他檢查,記錄或以其他方式處理$?的值的命令後,它將被保留。另外,我正在登錄並退出任意非零狀態,而不僅僅是1.理論上,退出狀態1的退出狀態可能不同於退出狀態2,但在此我們採用相同的操作日誌然後退出任何錯誤的行動。