2010-01-25 6 views
85

Si un script Bash a set -e et qu'une commande dans le script renvoie une erreur, comment puis-je effectuer un nettoyage avant la fermeture du script?Comment exécuter une commande avant la fermeture d'un script Bash?

Par exemple:

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

Comment puis-je faire en sorte que /tmp/foo est retirée, même si l'une des commandes dans ... do stuff ... échoue?

Répondre

131

Voici un exemple d'utilisation piège:

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

Sortie:

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

Notez que même si la ligne de asdffdsa a échoué, le nettoyage était encore exécuté.

5

De la référence pour set:

-e

Quitter immédiatement si une simple commande (voir la section 3.2.1 Commandes simples) retourne une valeur non nulle, sauf si la commande qui échoue fait partie d'une boucle until ou while, partie d'une instruction if, partie d'un & & ou || liste, ou si l'état de retour de la commande est inversé en utilisant!. Un déroutement sur ERR, s'il est défini, est exécuté avant la sortie du shell.

(Emphase mine).

9

De l'bash manpage (concernant builtins):

piège

[-lp] [[arg] sigspec ...]
La commande arg doit être lue et exécutée lorsque le shell reçoit le signal (s) sigspec.

Ainsi, comme il est indiqué dans Anon.'s answer, appelez trap tôt dans le script pour configurer le gestionnaire que vous désirez sur ERR.

+3

Vous pouvez également piéger sur EXIT. –

+0

Exécutez 'help trap' pour voir de l'aide sur le built-in. – Flimm

6

voici un reference pour vous sur les signaux de piégeage et de régler -e connexes. Regarde.

+0

C'est exactement ce que je cherchais, merci. – nelaaro

Questions connexes