bash允许$'字符串'
扩展。我的man bash
说:
$'string'
的单词被特殊处理。该单词扩展为string
,其中反斜杠转义字符按照ANSI C标准指定的方式替换。如果存在反斜杠转义序列,则按以下方式解码:\a
警报(响铃) \b
退格 \e
\E
转义字符 \f
换页符 \n
换行符 \r
回车符 \t
水平制表符 \v
垂直制表符 \
反斜杠 \'
单引号 \"
双引号 \nnn
八位字符,其值为八进制值nnn
(一到三个数字)\xHH
八位字符,其值为十六进制值HH
(一个或两个十六进制数字)\cx
控制字符x
扩展后的结果是单引号括起来的,就像美元符号不存在一样。
但是,为什么bash不能将$'\0'
和$'\x0'
转换成空字符?
这是否有文档说明?是否有原因?(它是一个特性还是一个限制甚至是一个错误?)
$ hexdump -c <<< _$'\0'$'\x1\x2\x3\x4_'
0000000 _ 001 002 003 004 _ \n
0000007
echo
给出了预期的结果:
> hexdump -c < <( echo -e '_\x0\x1\x2\x3_' )
0000000 _ \0 001 002 003 _ \n
0000007
我的bash版本
$ bash --version | head -n 1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
为什么echo $'foo\0bar'
的行为与echo -e 'foo\0bar'
不同?