私はシェルが実際にパイプされたコマンドをどのように実行するのか考えたことがありません。私はいつも「プログラムの標準出力は管路パイプについて考える方法で他の人のstdin"に入れます。したがって、当然このケースが最初に実行され、次のA | B
stdoutを取得し、stdoutを入力として使用すると思いました。 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
ベストアンサー1
パイプラインコマンドが同時に実行されます。実行時に最初に開始するかどうかは、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
一致する最初の行を表示し、入力ファイルの読み取りが完了する前に処理を停止できます。
パイプラインプログラムが順次実行されることを読んだ場合は、この記事を離れてください。パイプラインプログラムは常に同時に実行されます。