Si uso trap
como se describe, por ejemplo, en http://linuxcommand.org/wss0160.php#trap para capturar ctrl-c (o similar) y limpiar antes de salir, entonces estoy cambiando el código de salida devuelto.
Ahora, esto probablemente no hará la diferencia en el mundo real (por ejemplo, porque los códigos de salida no son portátiles y, además, no siempre son inequívocos, como se discute en Código de salida predeterminado cuando finaliza el proceso ), pero todavía me pregunto si hay ¿Realmente no hay forma de evitar eso y devolver el código de error predeterminado para los scripts interrumpidos?
Ejemplo (en bash, pero mi pregunta no debe considerarse específica de bash):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Salida:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Editado para eliminar para que sea más compatible con POSIX).
(Editado nuevamente para convertirlo en un script bash, mi pregunta no es específica de shell).
Editado para usar el "INT" portátil para la trampa en favor del "SIGINT" no portátil.
Editado para eliminar llaves inútiles y agregar una solución potencial.
Actualizar:
Lo resolví ahora simplemente saliendo con algunos códigos de error codificados y atrapando EXIT. Esto puede ser problemático en ciertos sistemas porque el código de error puede diferir o la trampa EXIT no es posible, pero en mi caso está bien.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
lee las entradas del coproceso actual.
read
que lea desde el coproceso actual ytrap cmd SIGINT
no funcionará como el estándar dice que debe usartrap cmd INT
.