2017-10-23 11 views
1

docによると、レシピ部分では、タブの後のコードがシェルに送られます。シェルはmakefile関数を知らないはずです。私はmake aを実行した場合たとえば、メイクファイル機能がレシピ部分でも機能するのはなぜですか?

a: 
<tab>$(info ===) 

、それは

=== 
make: `a' is up to date. 

なぜを出力しますか?シェルは$(info ===)を知らないのですが、それはなぜ===を出力できますか?

答えて

2

$(info ...)はシェルによって解釈されていませんが、実際はmakeの特別な機能です。 info関数は展開された引数を出力します。この場合、定数はコンソールに戻って===になります。

この関数は、(拡張された)引数を標準出力に出力するだけです。この関数の展開結果は空の文字列です。

hereについて詳しく読むことができます。

+0

こんにちは、デレクブラウン。答えてくれてありがとう。しかし、私は理解していません。これは、ドキュメントhttps://www.gnu.org/software/make/manual/html_node/Execution.html#Executionと一貫していません。各行はサブシェルによって実行されます。 – user15964

+0

@ user15964各行はサブシェルによって実行されます。しかし、各行がサブシェルに渡される前に、 'make'は' $(...) 'や' $ {...} 'の形式の変数とメソッド呼び出し構文を処理します。詳細はこちらhttps://www.gnu.org/software/make/manual/html_node/Variables-in-Recipes.html#Variables-in-Recipes –

+0

しかしこれは別の問題を引き起こします。 '$(info ===)'が最初にmakeによって解釈されると、 '==='になります。この '==='がシェルに渡された場合、これは認識できないコマンドであり、エラーメッセージが表示されます。しかし実際、makeはこれについて不平を言っていません。だから '==='はシェルに送られませんよね?しかしあなたのリンク 'の$ i(LIST)の例では、 \ 'を最初に展開してシェルに送ります。これは一貫していません – user15964

関連する問題