シェルが実際にパイプされたコマンドをどのように実行するかについて、私は実際に考えたことはありません。私はいつも、「1つのプログラムのstdoutがパイプでつながれる」と言われてきました。 パイプについての考え方として。当然のことながら、たとえばA | B 、A 最初に実行され、次にB Aの標準を取得します 、およびAの標準出力を使用します 入力として。
しかし、人々がpsで特定のプロセスを検索すると気づきました 、grep -v "grep"が含まれます コマンドの最後で、grepであることを確認します 最終出力には表示されません。
これは、コマンドps aux | grep "bash" | grep -v "grep" ps grepを知っていた 実行されていたため、psの出力に含まれています 。ただし、ps 出力がgrepにパイプされる前に実行を終了します 、grepをどのようにして知ったのですか 実行されていましたか?
[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
承認された回答:
パイプされたコマンドは同時に実行されます。 ps | grep … 、psかどうかについては、抽選の運(または、カーネルの腸の奥深くでスケジューラーを微調整するスケジューラーと組み合わせたシェルの動作の詳細の問題)です。 またはgrep 最初に開始し、いずれの場合も同時に実行し続けます。
これは、最初のプログラムが操作を完了する前に、最初のプログラムから出力されたデータを2番目のプログラムが処理できるようにするために非常に一般的に使用されます。例
grep pattern very-large-file | tr a-z A-Z
grepの前でも、一致する行を大文字で表示し始めます 大きなファイルのトラバースが終了しました。
grep pattern very-large-file | head -n 1
一致する最初の行を表示し、grepのかなり前に処理を停止する場合があります 入力ファイルの読み取りを終了しました。
パイプされたプログラムが順番に実行されることをどこかで読んだ場合は、このドキュメントから逃げてください。パイプされたプログラムは同時に実行され、常に実行されます。