UNIX のコマンドについて読んでいてecho
、バックスラッシュ エスケープの解釈を有効にするために使用されるオプションを見つけました-e
。問題は、これらのバックスラッシュ エスケープ シーケンスの 1 つが \ \ であったことですが、次の 2 つのコマンドを使用したとき:
echo "hello\\\world"
そして
echo -e "hello\\\world"
同じ出力が得られます: hello\\world 、違いは何でしょうか? |
答え1
デフォルトではエスケープ シーケンスを展開しますが、-e オプションは非標準です。
echo 実装で echo 出力に -e が含まれていない場合、非準拠となります。
UNIX
ここでの問題は、最小限の POSIX 要件のみに従い、 -compatible と呼ばれることが許可されているプラットフォームでは POSIX 拡張機能のサポートを実装する必要があるという事実を無視している実装があることXSI
です。
ところで、MacOS X および Solaris 上の bash は、常にエスケープ シーケンスを展開するようにコンパイルされます。デフォルトのコンパイル バリアントの bash は POSIX XSI に準拠していません。
ksh93、bosh、dash などの POSIX 準拠シェルは、必要に応じてデフォルトでエスケープ シーケンスを展開します。
動作を確認したい場合、テスト文字列は良いアイデアではありません。より良いテストは次のようになります。
echo '\tfoo'
foo
出力にタブ文字が付加されているかどうかを確認します。
問題が発生した理由は、foo\\bar
すでに二重引用符で囲まれた文字列内のバックスラッシュを使用していることと、シェルがバックスラッシュを二重引用符で囲んだ文字列で処理していることが原因です。動作を確認するにはecho
、引数として一重引用符で囲まれた文字列を使用する必要があります。