Je peux configurer des trap
scripts bash mais pas des fonctions bash.
Par exemple, source
le code ci-dessous et exécutez f
, essayez maintenant Ctrl+ C, il n'a pas été piégé!
Comment configurer les trap
fonctions bash?
4 trap ctrl_c INT
5
6 ctrl_c () {
7 echo "** Trapped CTRL-C"
8 }
9
10
11 f () {
12 for i in `seq 1 100`; do
13 sleep 1
14 echo -n "."
15 done
16 }
f
à la fin de votre code et supprimer l'espace duf ()
.Réponses:
C'est parce qu'il envoie SIGINT au processus au premier plan au lieu de
bash
(qui exécute le script). Si vous voulez faire cela, rendez la fonction asynchrone puis utilisezwait
(qui agira comme prévu et utilisera l'interruption).la source
f
c'est dans une pipeecho 123 | f
, alors ce n'est pas du piégeage?(command | command) &
Protip: envoie au processus de premier plan un QUIT avec Ctrl- \lorsque Ctrl- C, - Z, - Dne fonctionne pas.
Supprimer les pièges à la fin de l'exécution avec
trap - list of signals here
Amusant sur un système non-production: essayez de définir un piège pour tous les signaux sensibles (par exemple, pas KILL).
kill -l
(pas que ce soit un L minuscule pas un numéro 1 ou un tuyau |)la source
Je pense que vous devriez rendre la fonction globale
la source
INT
etSIGINT
sont également - cela ne fera aucune différence.