オプション -e を指定した echo の動作が、コマンド ラインと sh スクリプト内で異なるのはなぜですか?

オプション -e を指定した echo の動作が、コマンド ラインと sh スクリプト内で異なるのはなぜですか?

LinuxMint 17.2、カーネル 4.4.0-97-generic を使用しています。次の内容を含む小さな TestEcho.sh スクリプトを作成しました。

#!/bin/bash
echo -e "\e[1;31m Text in Color \e[0m\n"
for code in {33..43}; do echo -e "\e[38;05;${code}m $code: Text in Color"; done ; echo "";

このecho -eコマンドをコマンド ラインで実行すると、期待どおりの出力が得られます。つまり、エスケープ コードを解釈し、テキストをカラーで表示します。

.sh スクリプト内の同じコマンドは、オプションを無視し、リテラル テキストとして表示されるようechoです。さらに、for ループも壊れているようです。これは、 によって発生しますか? さらに重要なのは、スクリプトを修正する方法です。-e-eecho -e

答え(George Vasiliouに感謝): スクリプトをbash次のように実行します。sh

$ bash ~/Download/TestEcho.sh

コマンドラインでの echo -e と sh スクリプト内での echo -e

答え1

bash と sh は異なる種類のシェルです。bash は最新で、sh よりもスマートです。スクリプトでは、シェル#!/bin/bashを使用して実行されるという意味で と記述しますbash。ただし、 を使用すると、シェルsh ~/Download/TestEcho.shを使用して実行されますsh

関連情報