2

誰もが違いは何ですか説明できますか

echo $"Starting $CMD" 

echo "String $CMD"

彼らは同じように見えます。

4

2 に答える 2

6

マニュアルページの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 の場合、ドル記号は無視されます。文字列が翻訳されて置換される場合、置換は二重引用符で囲まれます。

于 2012-08-07T03:00:38.673 に答える
4

$""言語翻訳に使用される引用の形式です。-Dフラグを指定して bash を呼び出すと、そのような文字列がすべて出力されます。ロケールがCまたはの場合POSIX、この形式の引用は何もしません。

これらの文字列は、gettext適切な翻訳を検索するために使用されます。たとえば、スクリプトに文字列が$"Hello, World"あり、その文字列をフランス語などに翻訳するための MO ファイルが適切にインストールされている場合、次のようにスクリプトを実行できます。

LANGUAGE=fr_FR ./yourscript

のすべてのインスタンスがBonjour、Tout le Monde$"Hello, World"として出力されることを期待します(これが実際に翻訳ファイルにあると仮定します)。

翻訳は魔法でも自動でもないため、翻訳エンジンにまだない翻訳文字列を提供する必要があります

(追伸 - リンク先のガイドにはこのセキュリティ バグについて言及されていますが、ざっと目を通すと見逃してしまう可能性があるため、ここで再度強調します。)

于 2012-08-07T02:57:15.513 に答える