コマンドでパイピングした後の標準入力の比較

コマンドでパイピングした後の標準入力の比較

私は次の形式が必要です(空白を埋める):

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つを読み取り、他のパイプとあまりにも多くを比較すると、パイプ全体がデッドロックになります。この問題は、buffer1つ以上のパイプを含むコマンドを使用して回避できます。

mkfifo p
cmd1 | tee p | cmd2 | buffer | diff p -
rm p

また、見ることができますここ他のバッファリングオプションの場合。

デッドロックの別の解決策は、変数を使用して出力全体をcmd1バッファリングすることです(メモリにロード)。

cmd1 | ( b=$(cat); cmd2 <<<"$b" | diff <(echo "$b") - )

おすすめ記事