BASH quebra readline no SIGINT
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?
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 ;-)