不使用「set -e」,腳本按預期運行,所有結果都正確生成。bash set -e在看起來沒有錯誤的命令後退出
添加「-e設置」後,此命令後退出:
./NameOfATool > result.txt
當我包裝「設置+ e」和周圍的命令「設置-e」,那麼腳本終止罰款。
問題是,它爲什麼會退出,或者命令有什麼問題?
p.s. 'NameOfATool'是從c代碼編譯的可執行文件。當我手動鍵入該命令時,它運行正常,不會出錯。
謝謝大家!
不使用「set -e」,腳本按預期運行,所有結果都正確生成。bash set -e在看起來沒有錯誤的命令後退出
添加「-e設置」後,此命令後退出:
./NameOfATool > result.txt
當我包裝「設置+ e」和周圍的命令「設置-e」,那麼腳本終止罰款。
問題是,它爲什麼會退出,或者命令有什麼問題?
p.s. 'NameOfATool'是從c代碼編譯的可執行文件。當我手動鍵入該命令時,它運行正常,不會出錯。
謝謝大家!
set -e
將導致腳本退出,如果任何命令返回非零退出狀態。 (好吧,有一些例外,但這是一般規則。)因此,./NameOfATool
顯然返回非零退出狀態。這可能意味着它實際上認爲存在錯誤,或者這可能意味着程序寫得不好,並且沒有報告成功的退出狀態,或者它可能意味着它使用特殊的退出狀態值來報告特定的事情(非常類似於標準實用程序diff
,其返回0表示「相同」,1表示「不同」,2表示「錯誤」)。
嘗試集+ E在你的陷阱:
set -e; trap 'set +e; echo Hello; false; echo World; exit 22;' ERR echo Testing false echo Never See This
省略此set +e
,你看不到的世界作爲陷阱退出非零退出代碼完成之前,疏水閥。
正如@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
在該命令後面加上一些'echo $?'以進行調試 – mnagel