2013-08-04 31 views
0

不使用「set -e」,腳本按預期運行,所有結果都正確生成。bash set -e在看起來沒有錯誤的命令後退出

添加「-e設置」後,此命令後退出:

./NameOfATool > result.txt 

當我包裝「設置+ e」和周圍的命令「設置-e」,那麼腳本終止罰款。

問題是,它爲什麼會退出,或者命令有什麼問題?

p.s. 'NameOfATool'是從c代碼編譯的可執行文件。當我手動鍵入該命令時,它運行正常,不會出錯。

謝謝大家!

+1

在該命令後面加上一些'echo $?'以進行調試 – mnagel

回答

1

set -e將導致腳本退出,如果任何命令返回非零退出狀態。 (好吧,有一些例外,但這是一般規則。)因此,./NameOfATool顯然返回非零退出狀態。這可能意味着它實際上認爲存在錯誤,或者這可能意味着程序寫得不好,並且沒有報告成功的退出狀態,或者它可能意味着它使用特殊的退出狀態值來報告特定的事情(非常類似於標準實用程序diff,其返回0表示「相同」,1表示「不同」,2表示「錯誤」)。

1

嘗試集+ E在你的陷阱:

set -e; 

trap 'set +e; echo Hello; false; echo World; exit 22;' ERR 

echo Testing 
false 
echo Never See This

省略此set +e,你看不到的世界作爲陷阱退出非零退出代碼完成之前,疏水閥。

0

正如@ruakh所說,這表示該工具正在以非零(=錯誤)狀態退出。你可以把它在總是成功的複合命令防止這種退出腳本:

./NameOfATool > result.txt || true 

如果工具非零狀態退出,它運行true,其成功;因此,整個複合命令被認爲是成功的。如果命令的退出狀態是顯著(即你需要能夠告訴如果它與地位0,1退出,或2),你可以記錄下來供以後使用:

./NameOfATool > result.txt && toolStatus=0 || toolStatus=$? 

...或者使用直接狀態:

if ./NameOfATool > result.txt; then 
    # do things appropriate for exit status = 0 
else 
    toolStatus=$? 
    # do things appropriate for exit status != 0 
fi 
相關問題