私はいくつかの理由でかなり移植性の高いシェルスクリプトで書こうとする小さなオープンソースプロジェクトを持っています。自動化された統合テストは、パス式の敵対文字が正しく処理されているかどうかを確認します。
/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
。
dash
1はこの点で互換性がありますが、UNIX仕様(POSIX + XSI)で必要なものは出力しません。echo
echo -n
-n<newline>