@
プレフィックスは、Makefilesのシェルコマンドからの出力を抑制し、-
プレフィックスは、シェルコマンドからのエラーを無視します。 2つを組み合わせる方法はありますか?つまり、出力を抑制してエラーを無視するプレフィックスですか? @-
または-@
動作します。
実際、_@-
_と_-@
_は両方とも機能しますが、make: [target] Error 1 (ignored)
警告を出力します。
代わりに、使用できます
_@command || true
_
または、_:
_はシェルのtrue
の省略形であるため、
_@command ||:
_
これは、目に見えないコマンドでエラーが無視されたというMakeのわかりにくい警告を回避するためです。
コマンドの戻り値を無視したい最も一般的な2つのケースを考えてみましょう。
2番目のケースでは、コマンドによって生成されたログファイルの警告をgreppingする例を考えてください。 grep
は、一致するものが見つからない場合にエラーを返します。
_.PHONY: all one two three
all: at-warning at-success or-success or-warning
at-%: %.log
@echo Making $@
@-grep ^Warning $<
or-%: %.log
@echo Making $@
@grep ^Warning $< ||:
success.log:
echo 'Success!' > $@
warning.log:
echo 'Warning: foo' > $@
clean::
rm -f {success,warning.log}
_
生成するもの:
_echo 'Warning: foo' > warning.log
Making at-warning
Warning: foo
Making at-success
make: [at-success] Error 1 (ignored)
Making or-success
Making or-warning
Warning: foo
_
_@-
_を使用すると、成功すると無意味な無視エラー警告が生成されますが、_|| true
_は警告と警告の不在の両方を文句なしに処理します。
理論的に_|| true
_を使用することは_@-
_を使用するよりも遅くなりますが、このオーバーヘッドは、適切に設計され維持されたビルドシステムのボトルネックになることはほとんどありません。時間の大部分は、パフォーマンスに測定可能な影響を与えるために必要な戻り値がすべて無視される何千ものクイックコマンドを実行するのではなく、ビルド、またはビルドするものがない場合のタイムスタンプのチェックに費やす必要があります。
GNU makeでは、両方の@
および-
:
all:
@-exit 1
これをgmake 3.81で実行すると、次の出力が生成されます。
gmake:[all]エラー1(無視されます)
ご覧のとおり、コマンドはエコーされず、エラーは期待どおりに無視されます。