Si j'utilise trap
comme décrit par exemple sur http://linuxcommand.org/wss0160.php#trap pour attraper ctrl-c (ou similaire) et nettoyer avant de quitter, je change le code de sortie retourné.
Maintenant, cela ne fera probablement pas de différence dans le monde réel (par exemple parce que les codes de sortie ne sont pas portables et en plus de cela pas toujours sans ambiguïté comme discuté dans Code de sortie par défaut lorsque le processus est terminé? ) Mais je me demande toujours s'il y a vraiment aucun moyen d'empêcher cela et de retourner le code d'erreur par défaut pour les scripts interrompus à la place?
Exemple (en bash, mais ma question ne doit pas être considérée comme spécifique à bash):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Production:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Modifié pour le supprimer afin de le rendre plus conforme à POSIX.)
(Modifié à nouveau pour en faire un script bash à la place, ma question n'est pas spécifique au shell.)
Édité pour utiliser le "INT" portable pour le piège en faveur du "SIGINT" non portable.
Modifié pour supprimer les accolades inutiles et ajouter une solution potentielle.
Mettre à jour:
Je l'ai résolu maintenant en quittant simplement avec certains codes d'erreur codés en dur et en piégeant EXIT. Cela peut être problématique sur certains systèmes car le code d'erreur peut différer ou le piège EXIT n'est pas possible, mais dans mon cas, c'est assez bien.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
lecture des entrées du coprocessus actuel.
read
de lire à partir du coprocessus actuel ettrap cmd SIGINT
ne fonctionnera pas comme le standard dit que vous devez utilisertrap cmd INT
.