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?

¿Fue útil?

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í; -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top