2012-08-07 76 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