2013-03-27 221 views
38

最後有沒有像java try catch這樣的linux bash命令? 或者linux的shell總是繼續?Linux shell最後試試catch

try { 
    `executeCommandWhichCanFail` 
    mv output 
} catch { 
    mv log 
} finally { 
    rm tmp 
} 
+4

檢查'&&'和''||見 – 2013-03-27 10:23:37

+0

http://stackoverflow.com/questions/7251619/how-can-i-嘗試做某事然後檢測如果它在bash中失敗 – 2013-03-27 10:24:32

+0

http://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting – 2013-03-27 10:28:25

回答

69

嗯,有點:

{ # your 'try' block 
    executeCommandWhichCanFail && 
    mv output 
} || { # your 'catch' block 
    mv log 
} 

rm tmp # finally: this will always happen 
+3

請注意,您必須在'executeCommandWhichCanFail'後面使用'&&',否則它會盲目進行。即使你在前面用'set -e'(我不明白)。 – AJP 2014-01-09 14:55:40

+2

簡潔而簡潔。但我更喜歡使用'trap',因爲'||'不能確保即使在特殊情況下(信號)也能執行其他部分,這幾乎是'finally'所期望的。 – 2015-09-23 09:00:19

1

mv有兩個參數,那麼可能是你真的想貓的輸出文件的內容:根據您的例子

53

,它看起來像你正在嘗試做類似於總是刪除臨時文件的事情,而不管腳本如何退出。在Bash中,請嘗試使用trap內置命令來捕獲EXIT信號。

#!/bin/bash 

trap 'rm tmp' EXIT 

if executeCommandWhichCanFail; then 
    mv output 
else 
    mv log 
    exit 1 #Exit with failure 
fi 

exit 0 #Exit with success 

traprm tmp聲明腳本退出時,總是執行,因此文件「TMP」永遠試圖將其刪除。

安裝的陷阱也可以重置;只有信號名稱的陷阱調用會重置信號處理程序。

trap EXIT 

有關詳細信息,請參閱bash的手冊頁:man bash

+1

使用「陷阱」的一個好處是,除了EXIT外,您還可以捕獲其他信號。特別是,你可以捕獲SIGINT(Control-C)。爲此,只需在陷阱語句的末尾添加它即可。例如'trap'rm tmp'EXIT SIGINT'。 – ishmael 2014-06-18 23:29:03

+0

是的,SIGTERM也會有所幫助。使腳本健壯[清理tmp文件,即使'被殺死'] – C19 2015-01-07 13:05:02

+3

從一個快速測試看來,'EXIT'處理程序也**調用了'SIGINT'和'SIGTERM' – Cuadue 2015-01-08 21:59:41