現在の報奨通知の質問:
一般的な例は複雑すぎます。誰かが次の例を実装する方法を説明できますか?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
ここに答えがあるようです。
Gillesの回答に示されているように、一般的な考え方は、パイプラインのさまざまな段階で「プロデューサー」コマンドの出力を新しいデバイスファイル1に送信し、「コンシューマ」コマンドで使用できるようにすることです。システムがファイル記述子へのアクセスを提供すると仮定します/dev/fd/X
)。
探しているものを達成する最も簡単な方法は、おそらく次のとおりです。
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(読みやすくするため、および単一のコマンドで十分なため、代わりに使用file1.xz
します)。"$1"
xz -cd
cat ... | xz -d
最初の「プロデューサー」コマンドの出力は、xz -cd file1.xz
複合コマンド({...}
)にパイプされます。ただし、次のコマンドの標準入力としてすぐに消費されるのではなく、ファイル記述子に複製されるため3
、複合コマンド内のすべてにアクセスできるようになります/dev/fd/3
。次にxz -cd file2.xz
、標準入力もファイル記述子からも何も消費しない2番目の「プロデューサー」コマンドの出力は、3
「コンシューマ」コマンドdiff
にパイプ処理され、標準入力とから読み取ります/dev/fd/3
。
必要なだけの「プロデューサー」コマンドにデバイスファイルを提供するために、パイピングとファイル記述子の複製を追加することができます。例:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
特定の質問のコンテキストでは無関係かもしれませんが、次のことに注意する価値があります。
cmd1 <(cmd2) <(cmd3)
、cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
および( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
初期実行環境にさまざまな潜在的影響を与えます。
中に何が起こるかに反してcmd1 <(cmd2) <(cmd3)
、cmd3
そしてcmd1
中にはcmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
、ユーザからの入力を読み取ることができなくなります。それには、さらにファイル記述子が必要です。たとえば、一致する
diff <(echo foo) <(read var; echo "$var")
あなたのようなものが必要になります
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 それらの詳細はU&Lで見つけることができます。例えば/ devとそのサブディレクトリとファイルについてです。