谁能解释一下有什么区别
echo $"Starting $CMD"
和
echo "String $CMD"
它们看起来一样。
查找手册页的QUOTING
部分:bash
形式的词
$'string'
被特殊对待。该单词扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:
- \一个警报(铃)
- \b 退格
- \e 转义字符
- \f 换页
- \n 换行
- \r 回车
- \t 水平制表符
- \v 垂直制表符
- \ 反斜杠
- \' 单引号
- \nnn 八位字符,其值为八进制值 nnn(一到三位)
- \xHH 八位字符,其值为十六进制值 HH(一个或两个十六进制数字)
- \cx 一个 control-x 字符
扩展的结果是单引号的,就好像美元符号不存在一样。
$
请注意以下以( )开头的双引号字符串$"string"
:
以美元符号 ($) 开头的双引号字符串将导致根据当前语言环境翻译该字符串。如果当前语言环境是 C 或 POSIX,则忽略美元符号。如果字符串被翻译和替换,则替换是双引号。
$""
是一种用于语言翻译的引用形式。如果您使用该-D
标志调用 bash,它将打印出所有此类字符串。当语言环境是C
orPOSIX
时,这种形式的引用不会做任何事情。
这些字符串用于gettext
查找适当的翻译。例如,如果您的脚本有字符串$"Hello, World"
,并且您已经正确安装了 MO 文件以将该字符串翻译成法语,那么您可以这样执行您的脚本:
LANGUAGE=fr_FR ./yourscript
并期望 的所有实例都$"Hello, World"
输出为Bonjour, Tout le Monde(假设这是您的翻译文件中的实际内容)。
翻译不是魔术或自动的,因此您必须向翻译引擎提供它还没有的任何翻译字符串。
(PS - 我链接的指南确实提到了这个安全漏洞,但是如果你略读一下,你可能会错过它,所以我在这里再次强调它。)