2017-03-08 4 views
0

私はmakefileを持っていますが、アクションの1つでは、「echo」を使用しているので、modeset.txtというテキストファイルに文字列\noslideを書き込む必要があります。 -Eフラグはです。バックスラッシュエスケープの解釈を無効にしますエコーは、スティッキングの一部としてフラグを処理します(以下の出力を参照)。改行を解釈しないエコー

.PHONY: target all 

all: target 

target: 
    echo -E "\noslide" > modeset.txt 
clean: 
    rm -f modeset.txt 

文字列の一部として-Eを丸飲みエコーmodeset.txtファイルショーの内容:ここで

は私のメイクから剥ぎ取ら抜粋です。

-E 
oslide 

しかし、シェルでは、echo -eとecho -Eは期待どおりに動作するので、これを引き起こすmakefile環境は何ですか?

OS:バニラDebian 8公式ソースのみから。

+0

一部のシステムでは(Debianは含まれています)デフォルトのシェルは、 '/ binに/であるためです'-e'をサポートせずに' echo'を実装しています。回避策は、 'SHELL =/bin/bash'を指定するか、明示的に'/bin/echo'( 'ECHO =/bin/echo'を定義すること)を使用することです –

+0

GNU coreutilsをすべて使用するLinuxシステムでは動作しますしかし、他のシステム(BSDなど)上の '/ bin/echo'も同様に振る舞います。 – MadScientist

+0

@MadScientistそうです、 '/ bin/echo'の動作はシステムによって異なるかもしれませんし、特定のバージョンのGNU coreutils'/bin/echo'でも環境変数 'POSIXLY_CORRECT'の設定によって挙動が変わるかもしれません。つまり、OPの質問に対する答えはエコー、エコー、エコーがあるということです。シェル( 'SHELL'変数で指定されています - デフォルトは'/bin/sh')が存在すれば組み込み、 'PATH '(うまくいけば'/bin/echo'ですが、これは他の 'echo'コマンドがあれば' PATH'のディレクトリの順序に依存するかもしれません)。 –

答えて

1

echoは、単純なテキストを超えて移植性がありません。同じシステム内でも、使用するシェル(すなわち、シェルの組み込みechoとシステムの/bin/echo)に依存する可能性がある、さまざまなバージョンが存在します。

あなたは改行が続く単純なテキスト以外のものを表示したい場合は、あなたがprintfないechoを使用する必要があります。

target: 
     printf '\\noslide\n' > modeset.txt