Ich kann das nicht in meiner Umgebung (RHEL) neu erstellen - CTRL-C funktioniert gut für mich auf diesem. Nachdem Ihr Terminal abstürzt, würde ich ein neues öffnen und strace -p
verwenden, um zu sehen, was passiert.
Ich denke, dass es einige Probleme mit dem Befehl Setup im Allgemeinen gibt.
Zuerst ist, dass Sie Hintergrund cat
in der Unterschale sind. Doing this makes the stdin
of the cat
command /dev/null
, anstatt die Ausgabe von nc
, dass Sie in die Subshell pumpen. Sie können den Unterschied, indem den Ausgang dieses sehen:
#! /bin/bash
# doesn't print yay
while true; do
echo yay |
(cat & false) ||
break
done
mit diesem:
#! /bin/bash
# does print yay
while true; do
echo yay |
(cat ; false) ||
break
done
Auch bin ich nicht klar, ob dies absichtlich oder nicht, aber die Pause Zustand Ihrer Die Schleife basiert im Allgemeinen auf dem Exit-Code der Subshell, der seinerseits der Exit-Code echo
ist, der immer erfolgreich sein wird, so dass die Schleife im Allgemeinen unendlich ist. Sie können dies sehen durch false
in einem der oben mit einem echo
ersetzt:
#! /bin/bash
while true; do
echo yay |
(cat & echo test) ||
break
done
Und wie @chepner wies darauf hin, um Ihre Nutzung der nc
im Allgemeinen ist auch falsch. Per seiner Manpage:
-l Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host. It is an error to use this option in conjunction with the -p, -s, or -z options.
Dies tatsächlich verursacht Ihr nc
Befehl gar nichts zu tun (keine Ausgabe, sitzen nur dort). Sie können dies sehen, indem Sie mkfifo resp ; nc -l -p 80 < resp
in einer Shell als root ausführen und dann echo -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > resp
in einer anderen Shell als root ausführen.
Hoffe, das hilft.
Nicht sicher, ob es relevant ist, aber Sie müssen entweder die ersten beiden Zeilen Ihres Schleifenkörpers mit einem Backslash beenden oder die Pipe/oder Operatoren bis zum Ende der vorherigen Zeile verschieben. Derzeit haben Sie drei separate Befehle, die mit neuen Zeilen enden, und keine Liste mit einer Pipeline und dem Befehl "break". – chepner
'nc' kann entweder' -l' oder '-p' verwenden, aber nicht beides. Können Sie beschreiben, was dieses Programm tun soll? – chepner
@chepner Das hängt einzig vom Geschmack von nc/netcat ab (BSD vs. Linux). Das Gegenteil ist häufig erforderlich – sehe