31

末尾の改行なしで 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 は組み込みのエコーを使用していますか? 明らかに二重引用符の存在によって動作が変わりますが、なぜでしょうか?

アップデート

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

4

3 に答える 3

30

問題は、2つの事実の不幸な相互作用から来ています。

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

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

次に、シェルとしてmake使用しますが、の機能はMacOSXとLinuxで異なる方法で実装されます。/bin/sh/bin/sh

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

ところで、Makefile buitlinechoコマンドは、ケースが常に機能-nする理由を説明するフラグを理解します。b

問題を解決するためのクリーンでポータブルな方法は、@echo -nレシピを@printfレシピに置き換えることです。

于 2013-01-02T11:28:29.927 に答える
26

引用符についての何かが混乱していますmake。あなたのコードは私にとって同じように動作しますが、以下は期待どおりに機能します:

help:
        @echo -n Shouldn\'t print a newline

実行可能ファイルへのパスをハードコーディングすることもできます。

help:
        @/bin/echo -n "Shouldn't print a newline"

の Mac OS X のマニュアル ページではecho、シェル組み込みの の存在について説明しているときに、のはオプションをサポートしていないechoと述べていますが、最初の代替案が機能する理由を (とにかく) 説明できていません。echosh(1)-n


デフォルトでコマンドを実行するためにmake使用されていることの確認。Make manual 5.3.2 シェルの選択では、次のような仕様が指定されています。sh

シェルとして使用されるプログラムは、変数 SHELL から取得されます。この変数が makefile で設定されていない場合、プログラム /bin/sh がシェルとして使用されます。シェルに渡される引数は、変数 .SHELLFLAGS から取得されます。.SHELLFLAGS のデフォルト値は通常 -c で、POSIX 準拠モードでは -ec です。

SHELL = bash
help:
        @echo -n "Shouldn't print a newline"
        @echo -n Shouldn\'t print a newline

どちらの echo ステートメントも同じように動作します (改行は表示されません)。したがって、その変数がなければ、 のbashふりをしますshが、2 つの行の評価は異なります。質問 1: なぜですか? 質問 2: 2 行目は、エミュレートされた ではなく、ネイティブbashエコーまたはですか?/bin/echosh echo

于 2012-07-26T18:32:53.637 に答える
3

echoはbashシェルビルトインですが、makefileから実行すると、プログラムバージョンになります。

于 2012-07-26T17:55:53.450 に答える