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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top