パイプラインコマンドはどの順序で実行されますか?

パイプラインコマンドはどの順序で実行されますか?

私はシェルが実際にパイプされたコマンドをどのように実行するのか考えたことがありません。私はいつも「プログラムの標準出力は管路パイプについて考える方法で他の人のstdin"に入れます。したがって、当然このケースが最初に実行され、次のA | Bstdoutを取得し、stdoutを入力として使用すると思いました。 ABAA

しかし、私は人々が特定のプロセスを検索したときにそのプロセスが最終出力に表示されないようにするために、コマンドの最後にプロセスを含めることをps発見しました。これは、命令が実行中であり、したがって出力に含まれるという暗黙の知識が命令にあることを意味します。しかし、出力がパイプに接続される前に完了したら実行されているかどうかはどうすればわかりますか?grep -v "grep"grep
ps aux | grep "bash" | grep -v "grep"psgreppspsgrepgrep

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

ベストアンサー1

パイプラインコマンドが同時に実行されます。実行時に最初に開始するかどうかは、ps | grep …運の問題(またはシェル操作の詳細とカーネル内部スケジューラの微調整の問題)によって異なり、いずれにせよ開始されます。同時に実行されます。psgrep

これは、最初のプログラムがタスクを完了する前に、2番目のプログラムが最初のプログラムのデータを処理できるようにするために非常に一般的です。例えば

grep pattern very-large-file | tr a-z A-Z

grep大容量ファイルの検索が完了する前に、一致する行を大文字で表示し始めます。

grep pattern very-large-file | head -n 1

grep一致する最初の行を表示し、入力ファイルの読み取りが完了する前に処理を停止できます。

パイプラインプログラムが順次実行されることを読んだ場合は、この記事を離れてください。パイプラインプログラムは常に同時に実行されます。

おすすめ記事