リダイレクトを使用するときに空のファイルを作成しないでください。

リダイレクトを使用するときに空のファイルを作成しないでください。

foo | bar > out.txt出力は通常out.txt

ただし、foo失敗すると当然bar出力がないため生成されますout.txt。ただし、一般的な結果は、foo失敗すると空のout.txt出力が生成されることです。

私はしばしばMakefilesでこのタイプのコマンドを使用します。ここで問題はより複雑になります。空のファイルが作成されると、makemakeは空のファイルを表示して再生成する必要がないと判断するため、コマンドは動作を停止します。

out.txtパイプラインが基準を満たしていない場合に生成されないようにする方法はありますか?

ベストアンサー1

Makefileの場合は、常に一時ファイルとして作成して名前を変更してください。

out.txt: in.txt
       set -o pipefail ; foo $< | bar > [email protected]
       mv [email protected] $@

(もちろん、スペースの代わりにタブを使用してください)。

これはビルドプロセス中にショートカットに拡張できます。

out.txt: in.txt
       set -o pipefail ; foo $< | bar > [email protected]
       cmp -s [email protected] $@ || mv -f [email protected] $@

結果の out.txt ファイルが変更されていない場合、変更時間は更新されません。これは、変更されていないout.txtに依存するエントリを再構築する必要がないことを意味します。

おすすめ記事