1つのコマンドに2つのパイプ


9

次の構文に少し混乱しています。動作しますが、なぜ動作するのかわかりません。2つのパイプがdiffコマンドに接続されているようです。しかし、1つだけではありませんSTDINか?

例:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

ここでは、関連するtopic--へのリンクのプロセス置換 --in bashmanページを。
chepner

回答:


13

パイプは単に0(stdin)とは異なるファイル記述子にバインドされています。

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

もちろん、プロセスは一度に複数のオープンファイル記述子を持つことができるため、問題はありません。


呼び出された一時的なパイプしか知らなかった場合は、それをググることができただろう。ありがとうございました!

@iblue:「一時的なパイプ」と呼ばれているとは思わない。pipe()システムコールによって作成された、単なるパイプです。
Sven Marnach

正確には、「匿名の名前付きパイプ」と呼ばれることもありますが、ググるだけで十分です。

2
@WilliamPursell:関連するファイルはありません。シェルはpipe()、サブプロセスを使用して匿名パイプを作成し、サブプロセスをフォークします。匿名パイプが使用されている場合、メインプロセス追加のファイル記述子を開いています。これらの追加のファイル記述子はの形式/dev/fd/...で渡され、プロセスは通常、これらのファイル名を使用して単にそれらを開きます。これにより、それらがdup()編集され、さらに多くのオープンファイル記述子が作成されます。このプロセスでは、名前の付いたファイル記述子を、開いている呼び出しなしですぐに使用することもできます...
Sven Marnach

1
...この小さくて愚かなテストプログラムで実証されてます。にコンパイルした後a、私はそれをとして呼び出し./a <(ls)、ファイルのリストを正常に印刷し、指定されたファイル記述子(私の場合は63)がすでに開いていることを証明しました。bashはLinuxとは異なるアーキテクチャの一時ディレクトリで名前付きパイプを使用する場合があります。その場合、メインプロセスに入るときに追加のファイル記述子が開かれません。
Sven Marnach
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.