Ich kann diese beiden Befehle ausführen:
nc -l localhost 8888 -v >> output.txt &
(while true;do sleep 1;echo a;done)|nc localhost 8888 &
Alles funktioniert wie erwartet mit output.txt
dem Ausfüllen mit "a"s (von einem anderen Terminal aus). Wenn Sie jedoch ein einzelnes Zeichen in das Terminal eingeben, das die Hintergrundjobs ausführt, nc
ändert sich die Übermittlung von Running
zu Stopped
:
$ jobs
[1]+ Stopped nc -l localhost 8888 -v >> output.txt
[2]- Running ( while true; do
sleep 1; echo a;
done ) | nc localhost 8888 &
Beachten Sie auch, dass das Et-Zeichen im Hintergrund verloren geht. Ich weiß nicht, wo ich mit dem Debuggen beginnen soll. Ist das das erwartete Verhalten? Danke.
Mac OSX 10.9, GNU Bash 3.2.52
Antwort1
netcat ist bidirektional. Es kopiertausder Socket auf stdout undZuder Socket von stdin. Wenn Sie eine Taste drücken, erkennt es, dass Daten auf stdin (dem TTY) verfügbar sind, und versucht, diese zu lesen. Hintergrundjobs dürfen nicht vom TTY lesen, daher wird es angehalten.
Wenn Sie nicht beabsichtigen, Daten über den Socket zu senden, sollten Sie </dev/null
dies Ihrem Netcat-Befehl hinzufügen.
Und es ist normal, dass der jobs
Befehl das Et-Zeichen hinzufügt oder entfernt, wenn ein Job seinen Status ändert.