任何人都可以解释
之间的区别echo $"Starting $CMD"
和
echo "String $CMD"
他们似乎看起来一样。
答案 0 :(得分:6)
查看QUOTING
手册页的bash
部分:
$'string'
形式的单词是专门处理的。这个词扩展到了 字符串,反斜杠转义字符被替换为 ANSI C标准。反斜杠转义序列(如果存在)将被解码为 如下:
- \ a alert(bell)
- \ b退格
- \ e一个逃脱角色
- \ f form feed
- \ n新行
- \ r \ n回车
- \ t水平标签
- \ v vertical tab
- \ backslash
- \'单引号
- \ nnn八位字符,其值为八进制值nnn(一到三位数)
- \ xHH八位字符,其值为十六进制值HH(一个或两个十六进制数字)
- \ cx a control-x character
展开的结果是单引号,好像美元符号不存在一样。
请注意以下说明双引号字符串前面加$
($"string"
):
以美元符号($)开头的双引号字符串将导致该字符串 根据当前的语言环境进行翻译。如果当前区域设置为C. 或POSIX,美元符号被忽略。如果字符串被翻译并且 更换,替换是双引号。
答案 1 :(得分:4)
$""
是一种用于语言翻译的引用形式。如果使用-D
标志调用bash,它将打印出所有这些字符串。如果语言区域为C
或POSIX
,则此形式的引用不会执行任何操作。
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,但如果你浏览,你可能会错过它,所以我在这里再次强调它。)