142 votes

Comment exécuter une commande avant qu'un script Bash ne se termine ?

Si un script Bash a set -e, et qu'une commande dans le script retourne une erreur, comment puis-je faire un nettoyage avant la sortie du script?

Par exemple:

#!/bin/bash
set -e
mkdir /tmp/foo
# ... faire des choses ...
rm -r /tmp/foo

Comment puis-je m'assurer que /tmp/foo soit supprimé, même si l'une des commandes dans ... faire des choses ... échoue?

233voto

David M. Brown Points 1084

Voici un exemple d'utilisation de trap :

#!/bin/bash -e

function cleanup {
  echo "Suppression de /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Echoue

Sortie :

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: commande introuvable
Suppression de /tmp/foo
dbrown@luxury:~ $

Remarquez que même si la ligne asdffdsa a échoué, la fonction cleanup a quand même été exécutée.

14voto

dmckee Points 50318

Depuis la page de manuel de bash (concernant les commandes internes) :

trap [-lp] [[arg] sigspec ...]
La commande arg doit être lue et exécutée lorsque le shell reçoit le ou les signaux sigspec.

Ainsi, comme indiqué dans la réponse de Anon., appelez trap tôt dans le script pour mettre en place le gestionnaire que vous souhaitez sur ERR.

0 votes

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

9voto

Anon. Points 26829

De la référence pour set :

-e

Terminer immédiatement si une commande simple (voir section 3.2.1 Commandes Simples) se termine avec un statut différent de zéro, sauf si la commande qui échoue fait partie d'une boucle until or while, d'une déclaration if, d'une liste && ou ||, ou si le statut de retour de la commande est inversé en utilisant !. Un trap sur ERR, s'il est défini, est exécuté avant la sortie du shell.

(Souligné par moi).

1 votes

Il pourrait être utile d'ajouter "-E" lors de l'utilisation de "-e", voir vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail

0 votes

Pour ce que ça vaut, le piège s'exécute également à la sortie régulière du script, c'est-à-dire sur le bon chemin.

8voto

Saftever Points 115

Version du sh de la réponse de devguydavid sur Stack Overflow.

#!/bin/sh
set -e
cleanup() {
  echo "Suppression de /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Échoue

ref: shellscript.sh

0 votes

POSIX me fait sourire. :) Super site d'enseignement auquel vous avez également lié.

3voto

ghostdog74 Points 86060

Voici une référence pour vous sur le piégeage des signaux et les options liées à -e. Jetez un coup d'œil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X