Bash Break Readline su Sigint
Domanda
Provo a prendere un sigint ctrl + c all'interno di un loop di lettura su una presa ma la rottura che sto chiedendo solo di essere elaborato dopo una nuova linea.Quindi quando Ctrl + c la mia app in esecuzione, devo aspettare che una nuova riga arrivi nella presa prima che l'anello si rompe / l'app esce
Questa è la versione minima:
trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3
.
Come posso interrompere immediatamente il loop e uscire dall'app?
Soluzione
A break
non è un vero comando che puoi eseguire dove mai vuoi;È solo un costrutto sintattico per segnare un punto in cui lasciare un anello circostante.Il tuo break
non ha un ciclo circostante, quindi non ha senso (ed è un errore: bash: break: only meaningful in a `for', `while', or `until' loop
).
È necessario uccidere invece il comando read
:
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
.
Naturalmente, questa è solo una soluzione molto grezza, non nascondendo messaggi di errore rilasciati da sott'audotti di sottovoce ecc. Ma mostra l'idea e risolve il problema che hai chiesto di.Per nascondere il messaggio di errore previsto, ecc. Potresti voler porre altre domande (o semplicemente cercare le risposte già fornite qui; -)