bash允许扩展。我说:$'string'
man bash
表格中的单词会被特别对待。该单词扩展为,由ANSI C标准指定的反斜杠转义字符替换。反斜杠转义序列(如果存在)的解码方式如下:警报(响铃)退格转义符换行换行符返回水平制表符垂直制表符反斜杠单引号双引号双引号的八位字符,其值是八进制值(一到三)数字)八位字符,其值是十六进制值(一个或两个十六进制数字),一个控制字符
$'string'
string
\a
\b
\e
\E
\f
\n
\r
\t
\v
\
\'
\"
\nnn
nnn
\xHH
HH
\cx
x
扩展结果是单引号,好像没有美元符号。
但为什么庆典不能转化$'\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'
?
这是一个限制。bash
不允许字符串值包含内部NUL字节。
Posix(和C)字符串不能包含内部NUL。例如,请参见字符串的Posix定义(添加了强调):
3.92字符串
一个连续的字符序列,由第一个空字节终止并且包括第一个空字节。
同样,标准C对于字符串中的NUL字符也相当明确:
§5.2.1p2…基本执行字符集中应存在一个所有位都设置为0的字节,称为空字符;它用于终止字符串。
Posix明确禁止/
在文件名(XBD 3.170)或环境变量(XBD 8.1“ ...被视为以空字节结尾”)中使用NUL(和)。
在这种情况下,shell命令语言(包括bash)倾向于使用相同的字符串定义,作为由单个NUL终止的一系列非NUL字符。
当然,您可以通过bash管道自由传递NUL,并且没有阻止您将shell变量分配给输出NUL字节的程序输出的过程。但是,根据Posix,后果是“未指定的”(XSH 2.6.3“如果输出包含任何空字节,则行为未指定。”)。在bash中,除非使用bash的C-escape语法($'\0'
)将NUL插入字符串中,否则NUL将被删除,在这种情况下,NUL最终将终止该值。
实际上,请考虑以下两种尝试将NUL插入stdin
实用工具的方法之间的区别:
$ # Prefer printf to echo -n
$ printf $'foo\0bar' | wc -c
3
$ printf 'foo\0bar' | wc -c
7
$ # Bash extension which is better for strings which might contain %
$ printf %b 'foo\0bar' | wc -c
7
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句