Pergunta

Eu tento pegar um SIGINT ctrl+c dentro de um loop de leitura em uma tomada, mas a quebrar o que eu estou pedindo apenas para ser processado depois de uma nova linha.Então, quando eu ctrl+c meu executar o app, eu tenho que esperar por uma nova linha para chegar no soquete antes do loop de quebras / o aplicativo sai

Esta é a versão 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

Como posso imediatamente quebrar o loop e sair do aplicativo?

Foi útil?

Solução

Um break não é um verdadeiro comando, você pode executar onde quer que você quer;é meramente uma construção sintática para marcar um ponto onde deixar envolvente de loop.O seu break não tem uma envolvente loop, então não faz sentido (e é um erro: bash: break: only meaningful in a `for', `while', or `until' loop).

Você precisa matar o read comando:

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

Claro, esta é apenas uma muito bruto solução, não escondendo as mensagens de erro emitidas pelo terminou subshells etc.Mas ele mostra que a idéia e resolve o problema de você perguntou.Para esconder mensagem de erro esperado etc.você pode querer fazer outras perguntas (ou apenas a busca por já dadas respostas aqui ;-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top