Identifier le nom du signal reçu dans Bash

Lorsqu’un signal est reçu, je peux exécuter des commandes en utilisant trap . Exemple:

 trap 'echo hello world' 1 2 

Si l’un des signaux spécifiés est reçu, le monde salut est affiché.

Mais comment puis-je imprimer / identifier le nom du signal reçu?

(Si vous n’avez que le numéro d’un signal et que vous voulez le nom, kill -l $SIGNAL_NUM le nom d’un signal; vous pouvez éviter cela en utilisant les noms de signaux au lieu de numéros dans votre appel à trap comme ci-dessous.)

Cette réponse indique que la seule façon d’identifier le signal que vous avez piégé dans bash est d’écrire un wrapper distinct pour chaque signal différent que vous souhaitez intercepter. Une autre réponse à cette même question fournit une fonction d’encapsulation à faire pour vous:

Code:

 #!/bin/bash trap_with_arg() { func="$1" ; shift for sig ; do trap "$func $sig" "$sig" done } func_trap() { echo Trapped: $1 } trap_with_arg func_trap INT TERM EXIT read # Wait so the script doesn't exit. 

Si je lance cela, alors je peux envoyer des signaux au processus et j’obtiens une sortie comme

 Trapped: INT Trapped: TERM Trapped: EXIT 

Dans le piège (déclenché par un signal), le $? La variable est initialement définie sur le numéro du signal plus 128, de sorte que vous pouvez atsortingbuer le numéro de signal à une variable en faisant en sorte que la première instruction de l’action de trap ait quelque chose comme

 sig=$(($? - 128)) 

Vous pouvez alors obtenir le nom du signal en utilisant la commande kill

 kill -l $sig 

un moyen simple de le faire:

 _handler() { signal=$1 echo signal was $signal } trap '_handler SIGTERM' SIGTERM trap '_handler SIGINT' SIGINT