2013-02-12 17 views
5

當我運行帶有-e選項的bash腳本時,出現了一些對我來說沒有意義的行爲,該選項有多個與&&一起串聯的命令,其中一個命令失敗。我希望腳本停止失敗的命令並返回退出狀態,但是它只是快樂地執行腳本的其餘部分。爲什麼bash在短路命令的順序中不能停止錯誤?

下面舉例說明了意義,我:

$ false && true; echo $? 
1 

$ bash -xe -c "false && true"; echo $? 
+ false 
1 

$ bash -xe -c "false; true"; echo $? 
+ false 
1 

這裏是一個沒有意義對我說:

$ bash -xe -c "false && true; true"; echo $? 
+ false 
+ true 
0 

這是我不明白是什麼繼續。 false && true返回狀態1,所以腳本不應該停止執行並返回狀態1,就像腳本爲false; true時那樣?

雖然實驗,我發現它的作品我會想到辦法,如果我周圍的命令用括號鏈:

$ bash -xe -c "(false && true); true"; echo $? 
+ false 
1 

任何人都可以給這個解釋?

回答

7

這裏的邏輯是你使用&&已經錯誤檢查。 bash不會將if條件中的故障視爲值得中止,即使使用set -e也是如此。

將命令包裝在括號中時,實際上是在子shell中運行這些命令,因此腳本本身只會看到該子shell的返回,即:它根本不知道&&是否涉及到,所以它會像你期望的那樣夭折。

+0

這實際上很有意義。我知道'if'是這樣工作的,但是我從未想到bash會以同樣的方式處理&&。 – histumness 2013-02-12 20:18:22

4

答曰參考手冊:

殼不會退出如果失敗的命令是緊跟在同時或直到關鍵字,測試的一部分的if語句,部分命令列表的一部分任何在& &或||中執行的命令list,除了最後的命令& &或||之外的任何命令,但是最後一個命令或者命令的返回狀態與!