Я никогда не задумывался о том, как на самом деле оболочка выполняет конвейерные команды. Я всегда говорили , что «стандартный вывод одной программы получает по трубопроводу в потоке ввод других,» как способ мышления о трубах. Естественно, я подумал, что в случае, скажем, A | B, A запускается первым, затем B получает стандартный вывод A и использует стандартный вывод A в качестве входных данных.
Но я заметил, что когда люди ищут определенный процесс в ps, они включают grep -v "grep" в конце команды, чтобы убедиться, что grep не появляется в конечном выводе. Это означает, что в команде ps aux | grep "bash" | grep -v "grep", что означает, что ps знал, что grep запущен и поэтому находится в выводе ps. Но если ps завершает работу до того, как его выходные данные будут переданы в grep, как он узнал, что grep работает?
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