Comment configurer le trap dans les fonctions bash?

13

Je peux configurer des trapscripts bash mais pas des fonctions bash.

Par exemple, sourcele code ci-dessous et exécutez f, essayez maintenant Ctrl+ C, il n'a pas été piégé!

Comment configurer les trapfonctions 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 } 
Cheng
la source
2
Vous pouvez mettre un fà la fin de votre code et supprimer l'espace du f ().
GWF

Réponses:

7

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 utilisez wait(qui agira comme prévu et utilisera l'interruption).

Chris Down
la source
Cela fonctionne en quelque sorte. Mais j'ai trouvé que si fc'est dans une pipe echo 123 | f, alors ce n'est pas du piégeage?
Cheng
@Cheng Utilisez un sous-shell (et un pipe dans ce cas n'est de toute façon pas nécessaire, utilisez simplement un heredoc / herestring). (command | command) &
Chris Down du
1

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 |)

Barry A.
la source
0

Je pense que vous devriez rendre la fonction globale

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done
harish.venkat
la source
INTet SIGINTsont également - cela ne fera aucune différence.
Chris Down du