2012-08-07 77 views
2

以外的任何人都可以解釋什麼是他們似乎看起來是一樣的

echo $"Starting $CMD" 

echo "String $CMD" 

之間的差異。

回答

4

$""是一種用於語言翻譯的引用形式。如果你用-D標誌調用bash,它將打印出所有這樣的字符串。當區域設置爲CPOSIX時,這種引用形式不會執行任何操作。

這些字符串被gettext用來查找合適的翻譯。例如,如果你的腳本有串$"Hello, World",你已經正確安裝MO文件翻譯該字符串到,比如說,法國,你可以執行你的腳本是這樣的:

LANGUAGE=fr_FR ./yourscript 

和期望的$"Hello, World"所有實例是輸出爲Bonjour,Tout le Monde(假設這是您的翻譯文件中的實際內容)。

翻譯不是魔術或自動翻譯,所以you must provide the translation engine with whatever translation strings it doesn't already have

(PS - 我掛不提this security bug,但如果你撇去你可能會錯過它,所以我選中它再次蒞臨指導。)

+0

你能給我一些樣品嗎? – 2012-08-07 05:05:59

+0

@愛國者編輯舉例 – kojiro 2012-08-07 11:32:16

+0

對不起,'LANGUAGE = fr_FR。/ myscrip.sh'會打印'Hello,world'。它需要爲我的Linux做一些配置嗎? – 2012-08-07 13:34:56

6

中查找bash手冊頁的QUOTING部分:

專門處理表格$'string'的單詞。該字擴展爲 字符串,反斜槓轉義字符被替換爲 ANSI C標準中指定的字符。反斜槓轉義序列,如果存在的話,被譯碼爲 如下:

  • \一個警報(鐘形)
  • \ b退格
  • 。\ E轉義字符
  • \ f換
  • \ n新行
  • \ r回車
  • \ t水平標籤
  • \ v垂直的iCal標籤
  • \反斜槓
  • \」單引號
  • \ NNN的八位字符,其值是八進制值NNN(一到三位)
  • \ XHH的八位字符,其值是十六進制值HH(一個或兩個十六進制數字)
  • \ CX控制-X字符

膨脹的結果是單引號,彷彿美元符號不在場。通過$之前($"string"

,並注意如下描述雙引號中的字符串:

雙引號字符串用一個美元符號($)開頭將導致串 根據翻譯當前的語言環境。如果當前區域設置爲C 或POSIX,則忽略美元符號。如果翻譯字符串並替換 ,則替換爲雙引號。

+0

不幸的是,手冊頁沒有在實際符號'$「附近的某個地方留下,所以它可以通過一個理智的搜索找到。 – kojiro 2012-08-07 03:01:57

+0

它實際上在'extquote'選項附近確實存在,這就是我知道的找到'$''',但是,可能會更明顯 – larsks 2012-08-07 03:02:59

+0

QUOTING部分出現幸運字符串'$'',然後! – kojiro 2012-08-07 03:03:39