5

同僚はUbuntuを使用し、openSUSEを使用しています。同じmakefileを使用して同じソースコードをコンパイルしました。環境は正常に機能しますが、同僚は常に認識できない-eオプションを出力できません。makefileをチェックし、echoコマンド使用-eオプションのみを見つけます。

Ubuntuのエコー機能は他の人とは異なりますか?

+++++ makefileの更新、エコーは次のように定義します。

TOOLSDIR =

ECHO = $(TOOLSDIR)echo -e

$(TOOLSDIR)はツールのdirです。このmakeファイルは、LinuxまたはCYGWINがある場合、コンパイル環境を検出できます。

$(TOOLSDIR)が空の場合、Windowsの場合、次のようにWIN32バージョンのエコーツールディレクトリに移動します。

TOOLSDIR = $(subst /,\,$(MAKEDIR)/tools/WIN32/)

makeを実行すると、ubuntuは次のように出力します。

致命的なエラー:L3900U:認識されないオプション'-e'。

ただし、openSUSEにはこのエラーはありません

+++++echo-eの更新

私はubuntuでテストmakefileを書きます

all:
    echo -e hello

出力:

エコー-eこんにちは

こんにちは

+++++ openSUE(12.1)およびubuntu(12.04)でのmakefileテストの更新

all:
    echo -e "hello 1"
    echo -e hello 2
    echo -e he\nllo3
    echo -e "he\nllo4"
  1. opensuseの場合、出力は次のとおりです。

echo -e "hello 1"

こんにちは1

echo -e hello 2

こんにちは2

echo -e he \ nllo3

henllo3

echo -e "he \ nllo4"

llo4

  1. ubuntuでは、出力は次のとおりです。

echo -e "hello 1"

-e hello 1

echo -e hello 2

こんにちは2

echo -e he \ nllo3

henllo3

echo -e "he \ nllo4"

-e彼

llo4

その間、私はubuntuでテストし、エコーなし-eで、結果はopenSUSEの場合と同じで、エコーあり-e

4

4 に答える 4

7

使用しているシェルによって異なる場合があります(エコーはシェル内に実装されることがよくあります)

これはOSX(Mountain Lion)で起こることです:

$ bash
bash-4.2$ echo -e foo
foo
bash-4.2$ sh
sh-3.2$ echo -e foo
-e foo

OpenSUSEとUbuntuについても同じです。

-eオプションはPOSIXに準拠していません(よくわかりませんが、デフォルトの動作である必要があります)。ところで、フォーマットされたテキストを印刷するにprintfは、より適切なコマンドです。

あなたが提供した情報から、あなたのmakefileにバグ(移植性の問題)があるように見えます。

ところで、 OSXではオプションもman echoリストされていません。-eUbuntu 12.10では、-eは私のコンピューターに存在し、ルーターではBusyBox v1.13.4も受け入れます-e(busyboxの内部コマンドです)

しかし、おそらくそれは単に/bin/sh内部コマンドを使用してそれを無視しているだけです。

====更新:

makefileで、echoの前にある$(TOOLSDIR)を削除します。

ECHO = echo -e

実際、エコーのパスを指定すると(つまり/bin/echo)、シェルによって内部的に実装されたものではなく、ファイルシステムからプログラムを実行するようにシェルに強制します。

$ echo -e foo
foo
$ /bin/echo -e foo
-e foo
于 2013-01-04T02:05:59.567 に答える
1

私はまた、それがubuntuリンクによって引き起こされるかもしれないが、そうではないことを発見し/bin/shましdashbash。私が使用した後bash、問題は解決しました、そしてこれに関連する他の質問があります、それは私が尋ねました: 同じシェルスクリプトは異なるLinuxディストリビューションで異なる振る舞いをします

于 2013-08-07T05:08:44.383 に答える
1

Luigi R.ViggianoとHowChenの両方が、問題とその解決策について適切な説明を提供しています。実際、彼らの答えは互いに補完し合っています。

ダッシュでは、echoコマンドは-eフラグを受け入れません。ただし、bashではそうなります。

Ubuntuでは、デフォルトのシェルとしてdashではなくbashを選択するためにupdate-alternativesを使用することを検討するかもしれません。次のコマンドでうまくいきます(警告、これらのコマンドはシステム全体に適用されます)。

sudo update-alternatives --install /bin/sh sh /bin/bash 0
sudo update-alternatives --install /bin/sh sh /bin/dash 0
sudo update-alternatives --set sh /bin/bash
于 2014-10-14T19:36:27.900 に答える
-1

\シェルのエスケープ文字であり\n、「n」であるため、エスケープをエスケープし\\\nます。

[sg@Study ~]$ echo -e \\nfoo\\nfoo

foo
foo
[sg@Study ~]$

または引用符を使用します

[sg@Study ~]$ echo -e "\\nfoo\\nfoo"

foo
foo
[sg@Study ~]$ 
于 2013-08-06T18:03:02.573 に答える