TrollabWikibashtrap

Description

Le format général de la commande trap est :

trap [-lp] 'command_list'  [signaux…]

command_list étant une ligne de commandes pouvant inclure une fonction à exécuter à la réception de l'un des signaux
et signaux une listes de signaux à intercepter.
Pour ignorer un signal, utiliser la chaine vide à 2 simples quotes comme commande :

trap ''  signaux

Pour oublier un signal, utiliser :

trap - signaux

Principaux signaux POSIX.1 sous Linux ( voir SIGNAL(7) pour plus de détails): # |< 100% 50px - 5em 10em 10% >|

SignalValeurDescription
SIGHUP 1 Raccrochement (hangup) sur terminal de contrôle, ou mort du processus de contrôle.
SIGINT 2 Interruption depuis le clavier.
SIGQUIT 3 Demande 'Quitter' depuis le clavier.
SIGILL 4 Instruction/syscall illégal.
SIGABRT 6 Signal d'arrêt par abort(3).
SIGFPE 8 Erreur mathématique en virgule flottante.
SIGKILL 9 Signal 'KILL'.
SIGSEGV 11 Référence mémoire non valide.
SIGPIPE 13 Ecriture dans un tube cassé.
SIGALRM 14 Temporisation alarm(2) écoulée.
SIGTERM 15 Signal de fin.
SIGUSR1 10 Signal utilisateur 1.
SIGUSR2 12 Signal utilisateur 2.
SIGCHLD 17 Processus fils arrêté ou terminé.
SIGCONT 18 Continuer si arrêté.
SIGSTOP 19 Arrêt du processus.
SIGTSTP 20 Stop invoqué depuis tty.
SIGTTIN 21 Lecture sur tty en arrière-plan.
SIGTTOU 22 Ecriture sur tty en arrière-plan.

bash autorise les signaux interne supplémentaires DEBUG ERR EXIT et RETURN
l'option -l liste les signaux avec leur valeur l'option -p liste les fonctions associées au signal
le préfixe SIG des noms signaux est optionnel

trap - SIGHUP

sera équivalent à

trap - HUP

Exemple

Un gestionnaire de trap : test.sh

#!/bin/bash
 
# gestionnaire de trap : affiche la ligne de la dernière erreur rencontrée et exécute un traitement dessus
#
function my_trap_handler()
{
        MYSELF="$0"              # Nom du script
        LASTLINE="$1"            # argument 1 : ligne de dernière erreur
        LASTERR="$2"             # argument 2 : code d'erreur de la commande
        echo "${MYSELF}: line ${LASTLINE}: exit status of last command: ${LASTERR}"
 
        # possible d'ajouter un traitement supplémentaire comme l'envois de mail, des stats, etc.
}
 
# trap  les commandes avec code de retour non nul
#
trap 'my_trap_handler ${LINENO} $?' ERR
 
# on fait de la merde
#
rm /tmlkhmlggggfyyycactus
if [ "$?" = "0" ]; then
        echo "ok : dossier effacé."
else
        echo "échec : dossier non effacé."
fi
 
# la ligne suivante est la ligne 30
format c:                       # ;-)
 
# celle la la 33
ls /rfdkgjlfkgj

Voila le résultat de l'exécution du script (avec n°de lignes ajoutés) :

$ bash test.sh
1:  rm: /tmlkhmlggggfyyycactus: No such file or directory
2:  test.sh: line 22: exit status of last command: 1
3:  failed: directory not deleted.
4:  test.sh: line 30: format: command not found
5:  test.sh: line 30: exit status of last command: 127
6:  ls: /rfdkgjlfkgj: No such file or directory
7:  test.sh: line 33: exit status of last command: 1

enfin… si vous étiez sous unix, sinon… ;)
exemple écrit par Gianpaolo Del Matto http://phaq.phunsites.net/2010/11/22/trap-errors-exit-codes-and-line-numbers-within-a-bash-script/


Fichier : wiki › bash › trap - dernière modification le 05/10/2016 à 21:03 par Trollab


trollab.org, Since .... a long time ago, in a galaxy far, far away ...