2013-03-19 7 views
5

Ich bin mit dieser Abfrage in bash:von Endlos-Schleife zu brechen

mkfifo resp 
while true; do 
    sudo nc -l -p 80 < resp | 
    (cat & echo -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > resp) || 
    break; 
done 

Allerdings, wenn ich Strg + C, passiert nichts, und das Terminal blockiert.

Warum? Was mache ich falsch?

+0

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

+0

'nc' kann entweder' -l' oder '-p' verwenden, aber nicht beides. Können Sie beschreiben, was dieses Programm tun soll? – chepner

+0

@chepner Das hängt einzig vom Geschmack von nc/netcat ab (BSD vs. Linux). Das Gegenteil ist häufig erforderlich – sehe

Antwort

2

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.

+0

@Mat Joiner ich genehmige deine Bearbeitung :) –

+0

Hehe, ich genehmige deine Antwort. Natürlich sind Sie sehr stolz auf die Liebe zum Detail und das respektiere ich. Ich habe gerade die letzten 20 Minuten damit verbracht, mit der daraus folgenden Epiphanie zu spielen, die du mir bezüglich Bash gegeben hast. http://pastebin.com/fntNgc1T –

0

Ich vermute, das Sudo. Haben Sie versucht, Sudo aus dem Skript zu entfernen und das gesamte Skript zu sudozieren?

Haben Sie versucht ctrl-Z und ps a zu sehen, was es hält?