ダッシュのエコ拡張 \\\\ このbashのエコーと異なるのはなぜですか?

ダッシュのエコ拡張 \\\\ このbashのエコーと異なるのはなぜですか?

私はいくつかの理由でかなり移植性の高いシェルスクリプトで書こうとする小さなオープンソースプロジェクトを持っています。自動化された統合テストは、パス式の敵対文字が正しく処理されているかどうかを確認します。

/bin/shプロバイダが提供したユーザーを使用したbashテストでエラーが発生しました。これを次のように単純化しました。

echo "A bug\\'s life"
echo "A bug\\\\'s life"

Bash では、次のような予測結果が生成されます。

A bug\'s life
A bug\\'s life

私が開発したダッシュを使用して、次のことを行います。

A bug\'s life
A bug\'s life

まだダッシュでバグが見つからず、何かが抜けている可能性があります。これについて合理的な説明はありますか?

ベストアンサー1

存在する

echo "A bug\\'s life"

二重引用符\で二重引用符内で特別なので、最初のものは\シェルで次のように理解されます。逃げる/引用する第二\。したがって、A bug\'s life引数がに渡されますecho

echo "A bug\'s life"

同じ効果を得るでしょう。'二重引用符の中には特別な内容がないため\削除されないため、渡されたパラメータとまったく同じですecho

説明どおりなぜprintfがechoより優れているのですか?echo、実装間には多くの違いがあります。

UNIX準拠の実装では、dash組み込みのecho改行文字、バックスペース文字、オクテット文字シーケンス...およびバックスラッシュ自体の\エスケープシーケンスを導入するために使用されます。\n\b\0123\\

一部(非POSIX)では、-eオプションが必要な場合、または適合モードでのみこれを実行します(たとえば、OS / Xなどの正しいオプションを使用してビルドするとき、またはbash環境でsh呼び出すときなど)。SHELLOPTS=xpg_echo

したがって、標準(Unix標準のみ、POSIXは動作を指定しません)echo

echo '\\'

それは次のとおりです。

echo "\\\\"

出力一つバックスラッシュ(bash一貫性モードでない場合):

echo '\\'

出力されます二つバックスラッシュ。

避けてecho使用するのが最善ですprintf

$ printf '%s\n' "A bug\'s life"
A bug\'s life

この場合、すべての実装で同じように機能しますprintf


dash1はこの点で互換性がありますが、UNIX仕様(POSIX + XSI)で必要なものは出力しません。echoecho -n-n<newline>

おすすめ記事