コマンド呼び出しが成功した場合にのみ出力リダイレクト

コマンド呼び出しが成功した場合にのみ出力リダイレクト

diffコマンドの出力(この場合)をファイルにリダイレクトしたいが、比較するファイルに違いがある場合にのみ可能です。たとえば、、、、a3bつのファイルがあるとします。cここで、abは同じですが、aそうcではありません。

diff a c > output.txtこれにより、diff a b > output.txt違いがあるかどうかにかかわらずoutput.txt生成されます。output.txt違いがある場合にのみ生成したいです(たとえば、差が1を返します)。

私は似たようなことをしたい:

if ! diff a c > /dev/null; then
    diff a c > output.txt
fi

ただし、コマンドを2回実行する必要はありません。私できる次のようにコマンドの内容を保存します。

res=$(diff a c)
if [ $? != 0 ]; then
    echo "$res" > output.txt
fi

しかし、私はecho「仲介者」として介入し、いくつかの問題を引き起こす可能性があります。コードを複製せずに出力がある場合にのみ、出力をリダイレクト/ファイル生成する方法は?

答え1

コマンドを一度呼び出して出力をリダイレクトし、違いを作成せずに出力を削除できます。

diff a c > output.txt && rm output.txt

答え2

diff少なくともファイルが異なる場合、比較的高価なコマンドです。最小変更セットを計算するには(相対的に)CPUを大量に使用します。だから二度やりたくないのも理解になります。

cmpしかし、CPUに関する限り、価格は安いです。ファイルサイズが合理的であると仮定すると(複数のGBファイルに対してdiffを呼び出すかどうか疑問です)、パフォーマンスのコストはほとんどなく、同じファイルを使用すると高速になる可能性があります。

if ! cmp -s a c; then # -s = silent, do not print results to console
    diff a c > output.txt
fi

答え3

一時ファイルはどうですか?

diff a c > /tmp/output.txt
if [ $? != 0 ]; then mv /tmp/output.txt /my/folder/output.txt; else rm -f /tmp/output.txt; fi

確認ダイアログを削除するには、-fに置き換えます。-i

これにより、echo、printfなどの一時変数や「仲介者」なしでコマンドを2回実行するだけです。

関連情報