シェルがパイプされたコマンドを実際に実行する方法について、私は本当に考えたことがありません。パイプの考え方として、「あるプログラムの標準出力が別のプログラムの標準入力にパイプされる」といつも言われてきました。当然のことながら、私は言う場合、A | B、Aが最初に実行され、次にBがAの標準出力を取得し、Aの標準出力を入力として使用します。
しかし、psで特定のプロセスを検索する場合、コマンドの最後にgrep -v "grep"を含めて、grepが最終出力に表示されないようにすることに気付きました。これは、コマンドps aux | grep "bash" | grep -v "grep"。これは、psがgrepが実行されていることを知っていたため、psの出力に含まれることを意味します。しかし、出力がgrepにパイプされる前にpsの実行が終了した場合、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