GNU/Linux >> LINUX-Kenntnisse >  >> Linux

In welcher Reihenfolge werden weitergeleitete Befehle ausgeführt?

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.


Linux
  1. Geplante Befehle

  2. Warum betrachtet Grep eine Datei als binär?

  3. Linux – Woher wissen Sie, wofür Sie in Dmesg grep müssen?

  4. Piped-Befehle parallel ausführen?

  5. Befehle nach Systeminaktivität planen?

Was ist Git Bash? Arbeiten mit Git Bash-Befehlen

So führen Sie Linux-Befehle im Hintergrund aus

So führen Sie Sudo-Befehle ohne Passwort aus

So führen Sie sudo-Befehle ohne Passwort aus

Wie führe ich automatisch Befehle bei der SSH-Anmeldung aus?

Was ist die Standardreihenfolge der Linux-Sortierung?