このコードは、GNU makefile マニュアルの 8.6 章から入手したものです。
@どういう意味ですか?[Eメール保護]makefileのファイル関数argはどういう意味ですか? rmなどのシェルコマンドの前に「@」記号が付いているのはなぜですか?
program: $(OBJECTS)
$(file >[email protected],$^)
$(CMD) $(CMDFLAGS) @[email protected]
@rm [email protected]
ファイル関数の構文は次のとおりです。
$(file op filename[,text])
答え1
これには互いに関係のない3つの用途があります@
。
で$@
キャラクター@
は名前です自動変数ルールで使用できます。この変数の値は、ルールが構築されるターゲットです。
@
レシピ(コマンドライン)行の先頭、つまりタブ文字の直後に使用すると、コマンドが実行されます。印刷しない実行しようとしたとき。
他の場所のキャラクターは@
特別なものではありません。
したがって、あなたの例では以下を構築してくださいprogram
。
- これ
file
機能呼び出されます。ターゲット(自動変数)$^
の依存関係をファイルに書き込みますprogram.in
。 変数に保存されているすべてのコマンドは、
CMD
変数に保存されているパラメータCMDFLAGS
と追加のパラメータを使用して実行されます@program.in
。これがすることはCMD
それが何であるかによって異なります。コマンドは
rm program.in
最初に印刷せずに実行されます。
一部のコマンドは、先頭のパラメーターを、より多くの@
パラメーターを読み取るファイルを表すものとして扱います。これは、DOSがコマンドラインの長さに厳しい制限を設けてコマンドラインにコマンド出力を挿入できないために発生したDOSルールです。 Unixにはこのような制限がないため、これはUnixの世界では一般的ではありません。したがって、この式の効果は次のようになります。
$(CMD) $(CMDFLAGS) $(OBJECTS)
答え2
@ プレフィックスオンライン鎮圧エコライン。
デフォルトでは、各行は実行前にmake
印刷されます。Makefile
行がで始まる場合、@
この行は印刷されません。
いいえ@
:
$ cat > Makefile
hello:
echo hello world
$ make hello
echo hello world
hello world
そして@
:
$ cat > Makefile
hello:
@echo hello world
$ make hello
hello world
@
行の先頭のみが抑制されます。エコ。それとも単なる普通の文字列で、次に展開されます。>[email protected]
@[email protected]
$@
$ cat hello
hello:
@echo @[email protected]
$make hello
@hello.in