5

異なる Linux サーバーで実行したいシェル スクリプトがあります。-e オプションを指定して echo コマンドを実行し、文字列にエスケープ文字を含めると、Ubuntu 12.04 または Ubuntu 11.04 の sh シェルで期待どおりに実行されません。スクリプトを動作させたい使用中の 2 台のサーバーは、CentOS 5.3 と Ubuntu 12.04 を実行しています。2 つのサーバーの bash で次のコマンドを実行すると、期待どおりの出力が生成されます。

$ echo -e "line1\nline2"
line1
line2

CentOS マシンの sh で同じコマンドを実行すると、正しい出力も生成されます。しかし、Ubuntu 12.04 または 11.04 で sh でコマンドを実行すると、次の出力が生成されます。

$ echo -e "line1\nline2"
-e line1
line2

興味深いことに、Ubuntu の sh で以下を実行すると、エスケープ文字が自動的に解釈されます。

$ echo "line1\nline2"
line1
line2

スクリプトは sh シェルで実行する必要があり、異なるマシン間で移植できる必要があります。任意のソリューション。また、このようなことが起こる理由や方法を説明しているドキュメントへのリンクをいただければ幸いです。

4

2 に答える 2

6

Ubuntuのshシェルはdash. 組み込みの echo には-eオプションがありません (したがって、ご覧のとおり、単にエコーします)。むしろ、エスケープ動作をオフにする方法がありません。

/bin/echo代わりに使用してください。

使用しているシェルを確認するには、試してくださいecho $SHELL

$ echo $SHELL
/bin/bash
于 2012-10-22T05:44:20.890 に答える
0

echo実装間で絶望的に一貫性がありません。自明でないアプリケーション (エスケープ シーケンスなど) に対して一貫した動作が必要な場合は、printf代わりに使用します (最後の \n を明示的に追加することを忘れないでください)。

$ printf "line1\nline2\n"
line1
line2
于 2012-10-22T07:51:59.317 に答える