BASH bricht Readline bei SIGINT
Frage
Ich versuche, ein SIGINT strg + c in einer Leseschleife an einem Socket abzufangen, aber die gewünschte Unterbrechung wird erst nach einer neuen Zeile verarbeitet.Wenn ich also meine laufende App Strg + c drücke, muss ich warten, bis eine neue Zeile im Socket eintrifft, bevor die Schleife unterbrochen wird / die App beendet wird
Dies ist die Minimalversion :
trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3
Wie kann ich die Schleife sofort unterbrechen und die App beenden?
Lösung
A break
ist kein echter Befehl, den Sie ausführen können, wo immer Sie wollen;es ist lediglich ein syntaktisches Konstrukt, um einen Punkt zu markieren, an dem eine Umgebungsschleife verlassen werden soll.Ihrer break
hat keine Umgebungsschleife, also macht es keinen Sinn (und ist ein Fehler: bash: break: only meaningful in a `for', `while', or `until' loop
).
Sie müssen die töten read
befehl stattdessen:
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
Natürlich ist dies nur eine sehr grobe Lösung, die keine Fehlermeldungen verbirgt, die von terminierten Subshells usw. ausgegeben werden.Aber es zeigt die Idee und löst das Problem, nach dem Sie gefragt haben.Zum Ausblenden der erwarteten Fehlermeldung usw.vielleicht möchten Sie andere Fragen stellen (oder suchen Sie einfach hier nach bereits gegebenen Antworten ;-)