¿Cómo configurar trap en funciones bash?

13

Puedo configurar trapen scripts bash pero no en funciones bash.

Por ejemplo, sourceel código a continuación y ejecutar f, ahora prueba Ctrl+ C, no ha sido atrapado

¿Cómo configurar trapen funciones 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
fuente
2
Puede poner un fal final de su código y eliminar el espacio del f ().
GWF

Respuestas:

7

Esto se debe a que envía SIGINT al proceso en primer plano en lugar de a bash(que ejecuta el script). Si desea hacer esto, haga que la función sea asíncrona y luego use wait(que actuará como se esperaba y usará la trampa).

Chris Down
fuente
De alguna manera funciona. ¿Pero descubrí que si festá en una tubería echo 123 | f, entonces no está atrapando?
Cheng
@Cheng Use una subshell (y una tubería en este caso es innecesaria de todos modos, solo use un heredoc / herestring). (command | command) &
Chris Down
1

Protip: envíe el proceso en primer plano un QUIT con Ctrl- \cuando Ctrl- C, - Z, - Dno funcionan.

Elimina trampas al final de la ejecución con trap - list of signals here

Diversión en un sistema que no es de producción: intente establecer una trampa para todas las señales sensibles (por ejemplo, no KILL). kill -l(no es una L minúscula, no un número 1 o una tubería |)

Barry A.
fuente
0

Creo que deberías hacer que la función sea global

#!/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
fuente
INTy SIGINTson sinónimos, no habrá diferencia.
Chris Down