2013-03-27 5 views
38

最終的にJava try catchのようなlinux bashコマンドがありますか? また、Linuxシェルは常に起動しますか?Linuxシェルtry finally catch

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

チェック '&&'と '' || –

+0

はhttp://stackoverflow.com/questions/7251619/how-can-i-を参照してください。試して何かを見つけて、それが失敗した場合は –

+0

重複http://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting –

答えて

69

まあ、一種の:

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

rm tmp # finally: this will always happen 
+3

'executeCommandWhichCanFail'の後に' && 'を使わなければならないことに注意してください。たとえあなたが 'set -e'を使ってそれを先行させたとしても(私は理解しません)。 – AJP

+2

短く簡潔です。しかし、 '||'は例外的な条件(シグナル)であっても他の部分が確実に実行されるわけではないので、 'trap'を使うのが好きです。 –

1

mvは、2つのパラメータを取りますので、あなたが本当に猫に出力ファイルの内容を望んでいたことがあります。あなたの例に基づいて

53

、それをスクリプトがどのように終了するかにかかわらず、一時ファイルを常に削除するのと同じようなことをしようとしているようです。これを行うためのBashでは、信号をトラップするための組み込みコマンドtrapを試してください。

#!/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

「トラップ」を使用することについての1つの良い点は、EXIT以外の他の信号も捕捉できることです。特に、SIGINT(Control-C)を捕まえることができます。これを行うには、トラップ・ステートメントの終わりにタックしてください。例えば ​​'trap 'rm tmp' EXIT SIGINT'のようにします。 – ishmael

+0

うん、SIGTERMも助けになるだろう。スクリプトを頑強にする['killされたとしてもtmpファイルをクリーンアップ] – C19

+3

クイックテストからは、 'SIGINT'と' SIGTERM'のために 'EXIT'ハンドラも**呼び出されているようです。 – Cuadue

関連する問題