Ich habe nie wirklich darüber nachgedacht, wie die Shell tatsächlich Pipe-Befehle ausführt. Ich habe immer gesagt, dass die „stdout eines Programms wird verrohrt in den stdin eines anderen,“ als eine Möglichkeit , über Rohre zu denken. Also dachte ich natürlich, dass im Falle von sagen wir, A | B, A würde zuerst ausgeführt, dann erhält B die Standardausgabe von A und verwendet die Standardausgabe von A als Eingabe.
Ich habe jedoch festgestellt, dass bei der Suche nach einem bestimmten Prozess in ps grep -v "grep" am Ende des Befehls eingefügt wird, um sicherzustellen, dass grep nicht in der endgültigen Ausgabe angezeigt wird. Dies bedeutet, dass im Befehl ps aux | grep "bash" | grep -v "grep", was bedeutet, dass ps wusste, dass grep ausgeführt wird und daher in der Ausgabe von ps enthalten ist. Aber wenn ps die Ausführung beendet, bevor die Ausgabe an grep weitergeleitet wird, woher wusste es dann, dass grep ausgeführt wird?
flamingtoast@FTOAST-UBUNTU: ~$ 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