Ich habe nie wirklich darüber nachgedacht, wie die Shell tatsächlich geleitete Befehle ausführt. Mir wurde immer gesagt, dass die „stdout eines Programms piped wird into the stdin of another“, als Denkweise über Pipes. Also dachte ich natürlich, dass im Fall von, sagen wir, A | B
, A
würde zuerst laufen, dann B
erhält die Standardausgabe von A
, und verwendet die Standardausgabe von A
als seine Eingabe.
Aber ich habe das bemerkt, wenn Leute in ps
nach einem bestimmten Prozess suchen , würden sie grep -v "grep"
enthalten am Ende des Befehls, um sicherzustellen, dass grep
erscheint nicht in der endgültigen Ausgabe.
Das bedeutet, dass im Befehl ps aux | grep "bash" | grep -v "grep"
es wird vorausgesetzt, dass ps
wusste, dass grep
lief und steht daher in der Ausgabe von ps
. Aber wenn ps
beendet die Ausführung, bevor seine Ausgabe an grep
geleitet wird , woher wusste es, dass grep
lief?
[email protected]: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep
Akzeptierte Antwort:
Über die Pipe geleitete Befehle werden gleichzeitig ausgeführt. Wenn Sie ps | grep …
, ist es Glückssache (oder eine Frage der Details der Funktionsweise der Shell in Kombination mit der Feinabstimmung des Schedulers tief in den Eingeweiden des Kernels), ob ps
oder grep
beginnt zuerst, und in jedem Fall werden sie weiterhin gleichzeitig ausgeführt.
Dies wird sehr häufig verwendet, um es dem zweiten Programm zu ermöglichen, Daten zu verarbeiten, wenn sie aus dem ersten Programm herauskommen, bevor das erste Programm seine Operation abgeschlossen hat. Zum Beispiel
grep pattern very-large-file | tr a-z A-Z
beginnt bereits vor grep
die übereinstimmenden Zeilen in Großbuchstaben anzuzeigen hat das Durchlaufen der großen Datei beendet.
grep pattern very-large-file | head -n 1
zeigt die erste übereinstimmende Zeile an und stoppt möglicherweise die Verarbeitung weit vor grep
hat das Lesen seiner Eingabedatei beendet.
Wenn Sie irgendwo gelesen haben, dass gepipete Programme nacheinander ausgeführt werden, dann flüchten Sie dieses Dokument. Über die Pipe geleitete Programme werden gleichzeitig ausgeführt und haben dies immer getan.