Makefile の「echo -n」が機能しない 質問する

Makefile の「echo -n」が機能しない 質問する

Makefile で末尾の改行なしでテキストをエコーさせようとしていますが、できません。OS X でこの動作が発生しています (Linux ではすべて期待どおりに動作します)。

メイクファイル

a:
    @echo -n "hello"

b:
    @echo -n hello

c:
    @/bin/echo -n "hello"

出力:

$make a
-n hello
$make b
hello$make c
hello$

つまり、 はmake a壊れています。 いったい何が起こっているのでしょうか? make は組み込みの echo を使用していますか? 明らかに二重引用符の存在によって動作が変わりますが、なぜでしょうか?

アップデート

/bin/echo@chepner によって発見されたように、 makefile でフルパスを使用すると、 -n フラグが正しく認識されます。

ベストアンサー1

問題は残念な2つの事実の相互作用。

まず、make実行するレシピの複雑さに応じて 2 つの操作モードがあります。

  • コマンドが簡単は、make組み込みコマンドを使用してレシピを直接実行します。これがあなたのbケースで起こることです。
  • コマンドが複雑なは、makeレシピを解釈して実行するためのシェルを生成します。これがあなたのaケースで起こることです。

2 番目は、シェルとしてmake使用しますが、の機能は Mac OS X と Linux で異なる方法で実装されています。/bin/sh/bin/sh

  • Mac OS X では、 の機能は/bin/shによって実装されますbash。また、Mac OS X では、bashは でコンパイルされます--enable-strict-posix-default。このフラグの結果として、echoコマンドは フラグを理解しません-n
  • Linux では、 の機能は/bin/shによって実装されますがdash、これは POSIX 仕様に関してそれほど厳密ではありません。そのため、フラグはコマンド-nに実装されますecho

ちなみに、Makefile のビルドechoコマンドは-nフラグを理解するので、このbケースが常に機能する理由がわかります。

問題を解決するクリーンかつ移植可能な方法は、@echo -nレシピをレシピに置き換えることです@printf

おすすめ記事