diff <(cat old) <(cat new) を実行するときにどの fd が使用されますか?

diff <(cat old) <(cat new) を実行するときにどの fd が使用されますか?

私がするなら:

diff <(cat old) <(cat new)

これはdiffプログラム内で内部的に動作しますか? Bashスクリプトを使用して同じトリックをどのように達成できますか?

答え1

自分で試してみてください。

echo <(echo) <(echo)

Diff は 2 つのファイルを読み込みます。

<(...)これをbashスクリプトの引数として使用したい場合は、ファイルを「巻き戻す」(または再度開くことはできません)できないことに注意してください。だから一度読むと消えます。read一行ずつ処理することもできますし、grep何でもできます。何度も処理する必要がある場合は、その内容を変数に保存してください。

input=$(cat "$1"; printf x) # The "x" keeps the trailing empty lines.
input=${input%x}

または、一時ファイルにコピーして繰り返し読みます。

tmp=$(mktemp)
cat "$1" > "$tmp"

答え2

プログラムでは、とdiff入力することに違いはありませんdiff old new。この<(cmd)演算子はstdoutをcmd1fifoにリダイレクトし、fifoをパラメータとして渡しますdiff

例を見てください。

user@host:~$ echo <(ls)
/dev/fd/63

/dev/fd/63は出力を含むfifoですls。参照はcat <(ls)fifoの出力を印刷するため、出力になりますls

したがって、diffプログラムは次のように実行されます。

diff /dev/fd/63 /dev/fd/64

両方のfifoはcmdの出力を含みます。diffファイルだからです。

関連情報