Cuando se atrapa SIGINT en bash, ¿qué efecto tiene el “–” en el comando de trampa?
He estado leyendo varios posts sobre cómo manejar SIGINT
en bash
, pero aún no lo entiendo correctamente.
Sé que trap '_nombre_del_manipulador' SIGINT
ejecuta _nombre_del_manipulador
cuando se recibe la señal. (Siempre parece que la ponen entre comillas simples, pero no sé por qué. No me parece necesario).
Esperaba poder interceptar SIGINT
y manejarlo sin abortar un bucle en mi script, pero eso solo parece funcionar cuando el bucle está en su propia subshell. (No sé por qué es así…).
Pensé que usar trap -- '_nombre_del_manipulador' SIGINT
de alguna manera podría evitar que otras partes del script se aborten cuando se recibe la señal. (Esto se basa en mi lectura de esta respuesta).
Entonces, mi pregunta principal es: ¿qué efecto tiene --
en trap
? Pensé que siempre significaba “fin de los interruptores”, pero el ejemplo que estaba viendo no tenía un -
después de eso, por lo que parece redundante.
Y las subpreguntas que ayudarían a mi comprensión son: ¿qué efecto tiene trap
en las subshells, y por qué la gente pone el nombre del manipulador entre comillas en el comando trap
?
Para contextualizar, lo que estoy intentando hacer es detectar un SIGINT, finalizar educadamente un par de procesos y luego esperar unos segundos a que todo termine antes de salir manualmente.
PD: Este artículo fue interesante, aunque no logré obtener mi solución al leerlo.
ACTUALIZACIÓN: He trasladado lo que había aquí a una nueva pregunta, ya que resulta que lo que estoy preguntando aquí no es la causa del problema que he observado.
davy.ai
Entendiendo el manejo de SIGINT en Bash
Como experto en tecnología de la información especializado en Bash y en el manejo de
SIGINT
, permíteme aclarar tus preguntas.trap 'nombre_del_controlador' SIGINT
Como mencionaste correctamente,
trap 'nombre_del_controlador' SIGINT
establece un controlador de señal paraSIGINT
que ejecuta el código ennombre_del_controlador
cuando el script recibeSIGINT
. Las comillas simples alrededor denombre_del_controlador
se utilizan para evitar cualquier expansión o sustitución que pudiera ocurrir si se usaran comillas dobles en su lugar.trap -- 'nombre_del_controlador' SIGINT
El guion doble (
--
) después detrap
no es un interruptor paratrap
, sino una señal para indicar que cualquier argumento adicional que siga al guion doble no debe tratarse como interruptores. Es redundante en el ejemplo que proporcionaste, ya que no hay argumentos que lo sigan, pero es una buena práctica incluirlo en caso de que se agreguen argumentos adicionales más adelante.Subshells y
trap
Se crea un subshell cuando se ejecuta un proceso en un entorno de shell separado. En Bash, los subshells se utilizan a menudo para ejecutar tuberías de comandos (secuencias de comandos vinculados por tuberías). Cuando se envía una señal como
SIGINT
a un subshell, se maneja de forma independiente del script principal. Untrap
establecido en el script principal no afectará a un subshell, por lo que si quieres manejarSIGINT
en un subshell, necesitarás establecer untrap
separado dentro del subshell.¿Por qué colocar el nombre del controlador entre comillas?
Como se mencionó anteriormente, el uso de comillas simples alrededor del argumento
nombre_del_controlador
evita cualquier expansión o sustitución que pudiera ocurrir si se usaran comillas dobles en su lugar. Por ejemplo, si elnombre_del_controlador
contiene variables o sustitución de comandos, el uso de comillas dobles podría hacer que se evalúen en el momento en que se ejecuta el comandotrap
, en lugar de cuando se recibe la señal.¡Espero que esto aclare algunas de tus preguntas! En cuanto a tu objetivo principal de finalizar educadamente los procesos y esperar a que terminen antes de salir, hay muchas variables a considerar y se requeriría más información sobre tu escenario específico para brindar una respuesta completa.