2013-09-30 12 views
5

Voglio avere un'azione di pulizia nei miei script Bash, in questo modo:Prendi l'ExitCode dello script di shell in una "trappola EXIT"

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

true 
false 

Utilizzando $? è venuto in mente come una scelta naturale, ma questo non è il caso. Contiene sempre 0. C'è un modo in cui posso "spiare" sul codice di uscita nella trappola ERR?

[Aggiornamento:] Non ho idea di quello che avevo provato prima. Questo codice funziona come un fascino, quindi lo lascio qui come un piccolo e buon esempio.

+0

penso '$' è corretta. Il tuo copione stampa '1' per me. – dogbane

+0

Hah, so cosa è andato storto. Quando ho provato questa funzione, ho scritto un one-liner e ho sbagliato le quotazioni. Dicendo "trap" echo che esce con $? " ERR' chiaramente non funziona, dal momento che il '$?' Viene valutato alla _definizione_ dell'azione 'trap'. –

+0

Per chiunque cerchi, [una domanda simile è qui] (http://stackoverflow.com/q/32086595/471376). – JamesThomasMoon1979

risposta

3

tuo (probabilmente semplificato) esempio non presenta il problema che hai citato:

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ true 
+ false 
++ echo 'E: failed with exitcode 1' 
E: failed with exitcode 1 

Le probabilità sono che il comando di ritorno ERR viene eseguito in una o &&||, o soggetta ad altre condizioni menzionato nel frammento di seguito. Citando dal manual:

Se un sigspec è ERR, il comando arg viene eseguito ogni volta che un semplice comando ha uno stato di uscita diverso da zero, fatte salve le seguenti condizioni . Il ERR trappola non viene eseguito se il comando non è riuscito fa parte della lista dei comandi che segue immediatamente una parola chiave until o while, parte del test seguendo le if o elif parole riservate, parte di un comando eseguito in un elenco && o || oppure se lo stato di ritorno del comando viene invertito utilizzando !. Queste sono le stesse condizioni osservate dall'opzione errexit.

Quindi, se avete, per esempio, il seguente:

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

false && true 

Eseguito non causerebbe il fallimento essere intrappolati:?

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ false