Tengo el siguiente script:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Cuando envío SIGHUP(usando kill -HUP pid), no pasa nada.
Si cambio ligeramente el script:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... entonces el script hace echo HUPlo correcto al salir (cuando presiono Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
¿Que esta pasando? ¿Cómo debo enviar una señal (no necesariamente tiene que ser SIGHUP) a este script?

catfinalice el proceso. Pruebe su secuencia de comandos original y presioneCtrl+Dpara quecatsalga el proceso. Mientras elcatproceso está en primer plano,HUPno se actúa sobre la señal. Intente nuevamente concatreemplazado porread(un shell incorporado).while true; do read; doneal final, de lo contrario, ingresar texto hace que se cierre también, y quiero que se cierre en Ctrl + C.Respuestas:
El manual de Bash dice:
Eso significa que a pesar de que la señal se recibe
bashcuando la envía, su trampa en SIGHUP solo se llamará cuandocatfinalice.Si este comportamiento no es deseable, use
bashbuiltins (por ejemplo,read+printfen un bucle en lugar decat) o use trabajos en segundo plano (consulte la respuesta de Stéphane ).fuente
@xhienne ya ha explicado por qué , pero si desea que la señal actúe de inmediato (y no salir del script), puede cambiar su código a:
El pequeño baile con los descriptores de archivo es evitar el hecho de que
bashredirige stdin a los/dev/nullcomandos iniciados en segundo plano.fuente