2013-03-27 10 views
38

Esiste un comando di bash linux come java try catch, infine? Oppure la shell di Linux continua sempre?shell Linux tenta di catturare finalmente

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

controllo '&&' e '' || –

+0

Vedi http://stackoverflow.com/questions/7251619/how-can-i- try-to-do-something-and-then-detect-if-it-fail-in-bash –

+0

Duplicato di http://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting –

risposta

69

Beh, sorta di:

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

rm tmp # finally: this will always happen 
+3

Nota che devi usare '&&' dopo 'executeCommandWhichCanFail' altrimenti procede ciecamente. Anche se lo precede con l'uso di 'set -e' (che non capisco). – AJP

+2

Breve e conciso. Ma preferirei usare 'trap', dato che' || 'non garantisce che l'altra parte venga eseguita anche in condizioni eccezionali (segnali), che è praticamente ciò che ci si aspetta da' finally'. –

1

mv accetta due parametri, quindi potrebbe essere che si voleva davvero al gatto il contenuto del file di output:

53

Sulla base della sua esempio, sembra che tu stia cercando di fare qualcosa di simile all'eliminazione di un file temporaneo, indipendentemente da come si esce da uno script. In Bash per fare questo prova il comando incorporato trap per intercettare il segnale 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 

Il rm tmp economico nel trap viene sempre eseguito quando lo script esce, in modo che il file "tmp" volontà sempre cercato di essere eliminato.

Anche le trappole installate possono essere ripristinate; una chiamata al trap con solo un nome di segnale resetterà il gestore del segnale.

trap EXIT 

Per maggiori dettagli, vedere la pagina di manuale bash: man bash

+1

Una cosa carina dell'utilizzo di 'trap' è che puoi anche prendere altri segnali oltre a EXIT. In particolare, puoi prendere SIGINT (Control-C). Per fare ciò, attaccalo alla fine dell'istruzione trap. Ad esempio 'trap 'rm tmp' EXIT SIGINT'. – ishmael

+0

sì, SIGTERM sarebbe anche utile. rendere lo script robusto. [ripulire i file tmp anche se 'stato ucciso'] – C19

+3

Da un test rapido sembra che il gestore 'EXIT' sia ** anche ** chiamato per' SIGINT' e 'SIGTERM' – Cuadue

Problemi correlati