2010-01-25 17 views
85

Se uno script Bash ha set -e, e un comando nello script restituisce un errore, come posso fare un po 'di pulizia prima che lo script esca?Come eseguire un comando prima che uno script Bash venga chiuso?

Ad esempio:

#!/bin/bash 
set -e 
mkdir /tmp/foo 
# ... do stuff ... 
rm -r /tmp/foo 

Come posso garantire che /tmp/foo viene rimosso, anche se uno dei comandi in ... do stuff ... viene a mancare?

risposta

131

Ecco un esempio di utilizzo di trappola:

#!/bin/bash 
set -e 
function cleanup { 
    echo "Removing /tmp/foo" 
    rm -r /tmp/foo 
} 
trap cleanup EXIT 
mkdir /tmp/foo 
asdffdsa #Fails 

uscita:

[email protected]:~ $ sh traptest 
t: line 9: asdffdsa: command not found 
Removing /tmp/foo 
[email protected]:~ $ 

Si noti che anche se la linea asdffdsa fallito, ancora è stato eseguito la pulizia.

5

Dal riferimento per set:

-e

Uscire immediatamente se un semplice comando (vedere la sezione 3.2.1 semplici comandi) esce con uno stato diverso da zero, a meno che il comando che fallisce fa parte di un ciclo until o while, parte di un'istruzione if, parte di un & & o || lista, o se lo stato di ritorno del comando viene invertito usando! Una trappola su ERR, se impostata, viene eseguita prima che la shell esca.

(Enfasi mia).

9

Dal bash manpage (riguardanti builtins):

trappola [-lp] [[arg] sigspec ...]
Il comando arg è da leggere ed eseguito quando la shell riceve il segnale (s) sigspec.

Così, come indicato nella Anon.'s answer, chiamare trap presto nello script per impostare il gestore che si desidera sul ERR.

+3

È anche possibile intercettare su EXIT. –

+0

Esegui 'help trap' per vedere qualche aiuto sul built-in. – Flimm

6

qui è un reference per voi su segnali di trapping e impostare -e relativi. Dare un'occhiata.

+0

Questo è esattamente quello che stavo cercando grazie. – nelaaro

Problemi correlati