foo | bar > out.txt
出力は通常out.txt
。
ただし、foo
失敗すると当然bar
出力がないため生成されますout.txt
。ただし、一般的な結果は、foo
失敗すると空のout.txt
出力が生成されることです。
私はしばしばMakefilesでこのタイプのコマンドを使用します。ここで問題はより複雑になります。空のファイルが作成されると、make
makeは空のファイルを表示して再生成する必要がないと判断するため、コマンドは動作を停止します。
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に依存するエントリを再構築する必要がないことを意味します。