誰もが違いは何ですか説明できますか
echo $"Starting $CMD"
と
echo "String $CMD"
彼らは同じように見えます。
マニュアルページのQUOTING
セクションを調べてください:bash
フォームの単語は
$'string'
特別に扱われます。単語は文字列に展開され、バックスラッシュでエスケープされた文字は ANSI C 標準の指定に従って置き換えられます。バックスラッシュのエスケープ シーケンスが存在する場合は、次のようにデコードされます。
- \アラート (ベル)
- \b バックスペース
- \e エスケープ文字
- \f フォーム フィード
- \n 改行
- \r 改行
- \t 水平タブ
- \v 垂直タブ
- \ バックスラッシュ
- \' 一重引用符
- \nnn 値が 8 進数値 nnn (1 ~ 3 桁) である 8 ビット文字
- \xHH 値が 16 進値 HH (1 桁または 2 桁の 16 進数) である 8 ビット文字
- \cx control-x 文字
展開された結果は、ドル記号がなかったかのように単一引用符で囲まれます。
$
また、 ( $"string"
)で始まる二重引用符で囲まれた次の説明に注意してください。
二重引用符で囲まれた文字列の前にドル記号 ($) を付けると、現在のロケールに従って文字列が翻訳されます。現在のロケールが C または POSIX の場合、ドル記号は無視されます。文字列が翻訳されて置換される場合、置換は二重引用符で囲まれます。
$""
言語翻訳に使用される引用の形式です。-D
フラグを指定して bash を呼び出すと、そのような文字列がすべて出力されます。ロケールがC
またはの場合POSIX
、この形式の引用は何もしません。
これらの文字列は、gettext
適切な翻訳を検索するために使用されます。たとえば、スクリプトに文字列が$"Hello, World"
あり、その文字列をフランス語などに翻訳するための MO ファイルが適切にインストールされている場合、次のようにスクリプトを実行できます。
LANGUAGE=fr_FR ./yourscript
のすべてのインスタンスがBonjour、Tout le Monde$"Hello, World"
として出力されることを期待します(これが実際に翻訳ファイルにあると仮定します)。
翻訳は魔法でも自動でもないため、翻訳エンジンにまだない翻訳文字列を提供する必要があります。
(追伸 - リンク先のガイドにはこのセキュリティ バグについて言及されていますが、ざっと目を通すと見逃してしまう可能性があるため、ここで再度強調します。)