bash shell ksh zsh sh

bash - ¿Es necesario especificar trampas distintas a EXIT?



shell ksh (3)

Creo que la captura 0 se ejecuta justo antes de la terminación del script en todos los casos, por lo que es útil para la funcionalidad de limpieza (como eliminar archivos temporales, etc.). Las otras señales pueden tener un manejo de errores especializado, pero deben terminar el script (es decir, call exit).

Lo que has descrito, creo, en realidad ejecutaría cmd dos veces. Una vez para la señal (por ejemplo, SIGTERM) y una vez más en la salida (trampa 0).

Creo que la forma correcta de hacer esto es como la siguiente (vea la especificación POSIX para trap ):

trap "rm tmpfile" 0 trap "exit 1" TERM HUP ...

Esto garantiza que se elimine un archivo temporal al completar el script, y le permite establecer estados de salida personalizados en las señales.

NOTA : se llama a la trampa 0 si se encuentra una señal o no.

Si no le preocupa establecer un estado de salida, la captura 0 sería suficiente.

Veo muchos scripts de shell que hacen:

trap cmd 0 1 2 3 13 15 # EXIT HUP INT QUIT PIPE TERM

En cada shell al que tengo acceso en este momento, todas las trampas que no sean 0 son redundantes, y cmd se ejecutará al recibir una señal si la trampa simplemente se especifica:

trap cmd 0

¿Es la última especificación suficiente, o algunos shells requieren que se especifiquen las otras señales?


El estándar de shell no especifica si se ejecuta una captura en 0 cuando se recibe una señal no atada. En particular, bash y dash se comportan de manera diferente. Dada la trap cmd-list 0 sin las trampas establecidas para ninguna señal, bash ejecutará la lista de cmd al recibir SIGTERM, pero el guión no lo hará. Dada la trap cmd-list 0 2 , bash ejecuta cmd-list una vez que recibe SIGTERM, y el guión ejecuta cmd-list dos veces.


Para asegurarse de que el manejador de señales EXIT no se ejecute dos veces (que casi siempre no es lo que usted desea), siempre debe configurarse para ignorarse o restablecerse dentro de la definición del manejador de señales EXIT .

Lo mismo ocurre con las señales que tienen más de un controlador de señal definido para ellas en un programa.

# reset trap ''excode=$?; cmd; trap - EXIT; echo $excode'' EXIT HUP INT QUIT PIPE TERM # ignore trap ''excode=$?; trap "" EXIT; cmd; echo $excode'' EXIT HUP INT QUIT PIPE TERM