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
。