次のことをどのように理解するのか疑問に思いました:
コマンドのstdoutを別のコマンドのstdinにパイプすることは、強力な
テクニックです。しかし、複数の
コマンドのstdoutをパイプする必要がある場合はどうなりますか?これがプロセス置換の出番です。
言い換えれば、プロセス置換はパイプができることは何でもできますか?
プロセス置換は何ができますが、パイプはできませんか?
承認された回答:
それらの違いを理解する良い方法は、コマンドラインで少し実験することです。 <
の使用における視覚的な類似性にもかかわらず 文字、それはリダイレクトやパイプとは非常に異なることをします。
date
を使用しましょう テスト用のコマンド。
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
これは無意味な例ですが、cat
date
の出力を受け入れました STDINで吐き出します。プロセス置換でも同じ結果が得られます:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
しかし、舞台裏で起こったことは異なっていました。 STDINストリームが与えられる代わりに、cat
実際には、開いて読み取るために必要なファイルの名前が渡されました。このステップは、echo
を使用して確認できます。 cat
の代わりに 。
$ echo <(date)
/proc/self/fd/11
catがファイル名を受け取ると、ファイルの内容が読み取られます。一方、echoは、渡されたファイルの名前を示しただけです。この違いは、置換を追加するとより明白になります:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
プロセス置換(ファイルを生成する)と入力リダイレクト(ファイルをSTDINに接続する)を組み合わせることができます:
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
見た目はほとんど同じですが、今回はファイル名ではなくSTDINストリームが渡されました。これは、echoで試してみるとわかります:
$ echo < <(date)
<blank>
echoはSTDINを読み取らず、引数が渡されなかったため、何も取得されません。
パイプと入力リダイレクトは、コンテンツをSTDINストリームに押し出します。プロセス置換はコマンドを実行し、それらの出力を特別な一時ファイルに保存してから、コマンドの代わりにそのファイル名を渡します。使用しているコマンドが何であれ、それはファイル名として扱われます。作成されたファイルは通常のファイルではなく、名前付きパイプであり、不要になると自動的に削除されることに注意してください。
関連:Process Monitorでフィルタリングされたイベントは、メモリまたはディスクに保存されていますか?