私がするなら:
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をcmd1
fifoにリダイレクトし、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
ファイルだからです。