Nigdy tak naprawdę nie myślałem o tym, jak powłoka faktycznie wykonuje polecenia potokowe. Zawsze mówiono mi, że „standardowe wyjście jednego programu jest przesyłane do wejścia innego standardowego”, jako sposób myślenia o rurach. Więc naturalnie pomyślałem, że w przypadku powiedzmy A | B, A uruchamia się jako pierwsze, a następnie B pobiera standardowe wyjście A i używa standardowego wejścia A jako wejścia.
Zauważyłem jednak, że kiedy ludzie szukają określonego procesu w ps, dołączają grep -v „grep” na końcu polecenia, aby upewnić się, że grep nie pojawia się w końcowym wyniku. Oznacza to, że w poleceniu ps aux | grep "bash" | grep -v "grep", co oznacza, że ps wiedział, że grep jest uruchomiony i dlatego jest w wyniku ps. Ale jeśli ps zakończy działanie, zanim jego dane wyjściowe zostaną przekazane do grep, to skąd wiedział, że grep działa?
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