次のことを理解する方法を知りたいです。
あるコマンドの標準出力を別のコマンドの標準入力にパイプすることは強力な技術です。しかし、複数のコマンドの標準出力をパイプする必要がある場合はどうなりますか?ここでプロセス置換が開始されます。
つまり、パイプができることをプロセス交換ができますか?
パイプはできませんが、プロセスの置き換えは何ができますか?
ベストアンサー1
これらの違いを理解する良い方法は、コマンドラインでいくつかの実験を実行することです。<
役割の使用は視覚的に似ていますが、リダイレクトやパイプとは全く異なる動作をします。
date
テストにコマンドを使用します。
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
これは無意味な例ですが、cat
STDINから出力を取得しdate
て吐き出すことを示しています。手続き型置換を使用しても同じ結果が得られます。
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
しかし、後ろで何が起こるかは異なります。cat
実際に渡されるのは、STDINストリームを提供するのではなく、開いて読み取るために必要なファイル名です。代わりに、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
ほぼ同じように見えますが、今回はcatにファイル名の代わりにSTDINストリームが渡されます。 echoを使用してこれを確認できます。
$ echo < <(date)
<blank>
echoはSTDINを読み取らず、パラメータも渡されないため、何も得られません。
パイプと入力リダイレクトは、コンテンツをSTDINストリームにプッシュします。プロセス置換はコマンドを実行し、その出力を特別な一時ファイルに保存し、コマンドの代わりにそのファイル名を渡します。どのコマンドを使用しても、それをファイル名として扱います。生成されたファイルは通常のファイルではなく名前付きパイプであり、不要になると自動的に削除されます。