40 votes

Est-il nécessaire de spécifier des interruptions autres que EXIT ?

Je vois beaucoup de scripts shell qui font :

 trap cmd 0 1 2 3 13 15 # EXIT HUP INT QUIT PIPE TERM

Dans chaque shell auquel j'ai accès pour le moment, tous les pièges autres que 0 sont redondants et cmd sera exécuté à la réception d'un signal si le piège est simplement spécifié :

 piège cmd 0

Cette dernière spécification est-elle suffisante ou certains shells nécessitent-ils la spécification des autres signaux ?

23voto

carlo Points 231

Pour s'assurer que le EXIT ne sera pas exécuté deux fois (ce qui n'est presque toujours pas ce que vous voulez), il doit toujours être ignoré ou réinitialisé dans la définition du signal EXIT gestionnaire lui-même.

Il en va de même pour les signaux qui ont plusieurs gestionnaires de signaux définis pour eux dans un programme.

 # reset
trap 'excode=$?; cmd; trap - EXIT; echo $excode' EXIT HUP INT QUIT PIPE TERM

# ignore
trap 'excode=$?; trap "" EXIT; cmd; echo $excode' EXIT HUP INT QUIT PIPE TERM

8voto

William Pursell Points 56211

La norme shell ne spécifie pas si un trap sur 0 est exécuté lorsqu'un signal non trappé est reçu. En particulier, bash et dash se comportent différemment. Étant donné trap cmd-list 0 sans interruption définie pour aucun signal, bash exécutera la cmd-list à la réception de SIGTERM, mais pas dash. Étant donné trap cmd-list 0 2 , bash exécute cmd-list une fois à la réception de SIGTERM et dash exécute cmd-list deux fois.

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