私は次の形式が必要です(空白を埋める):
cmd1 | ____ cmd2 ____
これは次のとおりですが、ファイルを書きません。
cmd1 > temp
cmd2 < temp | diff temp -
cmd1は実際にはコマンドではなく、テキストエディタの標準入力ストリームであるため、何度も実行できないため機能しません。
diff <(cmd1) <(cmd1 | cmd2)
しかし、それは本質的に私が望むものです。
私はmacOSを使用していますが、Linuxと互換性があることを好みます。
ベストアンサー1
通常、ファイルに書きたくない場合(名前付き)パイプに置き換えることができますが、パイプは両方のプロセスで同時に読み取ることはできません。あなたの場合は、tee
分割入力を使用し、一端に名前付きパイプを使用できます。
mkfifo p
cmd1 | tee p | cmd2 | diff p -
rm p
しかし、ここには大きな欠点があります。パイプには限られたバッファ(Linuxでは64k)があるため、diffがパイプの1つを読み取り、他のパイプとあまりにも多くを比較すると、パイプ全体がデッドロックになります。この問題は、buffer
1つ以上のパイプを含むコマンドを使用して回避できます。
mkfifo p
cmd1 | tee p | cmd2 | buffer | diff p -
rm p
また、見ることができますここ他のバッファリングオプションの場合。
デッドロックの別の解決策は、変数を使用して出力全体をcmd1
バッファリングすることです(メモリにロード)。
cmd1 | ( b=$(cat); cmd2 <<<"$b" | diff <(echo "$b") - )