Bash Break Readline en Sigint
Pregunta
Intento capturar un SIGINT CTRL + C dentro de un bucle de leído en un zócalo, pero el descanso que estoy pidiendo solo para ser procesado después de una nueva línea.Entonces, cuando i Ctrl + C, mi aplicación en ejecución, tengo que esperar a que llegue una nueva línea en el zócalo antes de que el bucle se rompe / la aplicación sale
Esta es la versión mínima:
trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3
¿Cómo puedo romper inmediatamente el bucle y salir de la aplicación?
Solución
Un break
no es un comando real que puede ejecutar donde quiera;Es simplemente una construcción sintáctica para marcar un punto donde dejar un bucle circundante.Su break
no tiene un bucle circundante, por lo que no tiene sentido (y es un error: bash: break: only meaningful in a `for', `while', or `until' loop
).
Necesitas matar el comando read
en lugar de:
trap "killRead" SIGINT SIGHUP SIGTERM
killRead() {
kill $(cat /tmp/read.pid)
}
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3 & pid=$!
echo $pid > /tmp/read.pid
wait $pid
Por supuesto, esta es solo una solución muy cruda, no ocultando ningún mensaje de error emitido por subshundas terminadas, etc., pero muestra la idea y resuelve el problema que solicitó.Para ocultar el mensaje de error esperado, etc. Es posible que desee hacer otras preguntas (o simplemente buscar respuestas ya dadas aquí; -)