为什么$'\ 0'或$'\ x0'是一个空字符串?应该是空字符,不是吗?

哎呀

允许扩展。说:$'string'man bash

表格中的单词会被特别对待。该单词扩展为,由ANSI C标准指定的反斜杠转义字符替换。反斜杠转义序列(如果存在)的解码方式如下:警报(响铃)退格转义符行换行符返回水平制表符垂直制表符反斜杠单引号双引号双引号的八位字符,其值是八进制值(一到三)数字)八位字符,其值是十六进制值(一个或两个十六进制数字),一个控制字符$'string'string
\a
\b
\e
\E
\f
\n
\r
\t
\v
\
\'
\"
\nnnnnn
\xHHHH
\cxx

扩展结果是单引号,好像没有美元符号。

为什么不能转化$'\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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么$'\ 0'或$'\ x0'是一个空字符串?应该是空字符,不是吗?

来自分类Dev

为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

来自分类Dev

为什么这个假值会转换为空字符串而不是 0?

来自分类Dev

为什么空字符串可以在C ++中输出index 0元素

来自分类Dev

为什么不是“ 0” ==“ 0”?

来自分类Dev

string :: erase(0)在一个空字符串上?

来自分类Dev

为什么 /^[a-zA-Z0-9_]+$/ 和 /^[a-zA-Z0-9_]{1,}$/ 接受空字符串

来自分类Dev

为什么在PHP中会有一个字符串> ='0'?

来自分类Dev

字符串末尾的空字符'\ 0'

来自分类Dev

为什么有人会写一个字符串someString =“” + Convert.toChar(0)而不是someString =“ 0”

来自分类Dev

为什么对memset使用'\ 0'而不是0?

来自分类Dev

为什么对memset使用'\ 0'而不是0?

来自分类Dev

PHP + JavaScript:将空字符串与0进行比较时幕后发生了什么

来自分类Dev

空字符串和'\ 0'char有什么区别?(从指针和数组的角度来看)

来自分类Dev

为什么我的X11转发尝试失败并显示“ connect /tmp/.X11-unix/X0:没有这样的文件或目录”?

来自分类Dev

为什么 x^(-1/0) = 0

来自分类Dev

为什么这个React组件返回字符串'0'

来自分类Dev

为什么hexdump将0x0A解析为一个点?

来自分类常见问题

为什么x [0]!= x [0] [0]!= x [0] [0] [0]?

来自分类Dev

为什么BSON字符串(不是Cstring / ename)后面的0x00字节结尾?

来自分类Dev

为什么结果是 0x18 而不是 0x12?

来自分类Dev

在arm64汇编中,“ adrp x0,idmap_pg_dir;”是什么?指示是什么意思?

来自分类Dev

子进程Popen返回一个空字符串,作为communication()[0] .split('\ n')上的最后一个列表成员

来自分类Dev

对于Tmax(0x7fffffff)一个奇怪的问题,为什么(!x)== x?

来自分类Dev

为什么函数会在Java中修改array [0]而不是字符串?

来自分类Dev

为什么串联两个空字符串会导致一个空字符串?

来自分类Dev

为什么输出显示0而不是0.0?

来自分类Dev

为什么!0等于1而不是-1?

来自分类Dev

为什么变量 y 是 0,不是 2?

Related 相关文章

  1. 1

    为什么$'\ 0'或$'\ x0'是一个空字符串?应该是空字符,不是吗?

  2. 2

    为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

  3. 3

    为什么这个假值会转换为空字符串而不是 0?

  4. 4

    为什么空字符串可以在C ++中输出index 0元素

  5. 5

    为什么不是“ 0” ==“ 0”?

  6. 6

    string :: erase(0)在一个空字符串上?

  7. 7

    为什么 /^[a-zA-Z0-9_]+$/ 和 /^[a-zA-Z0-9_]{1,}$/ 接受空字符串

  8. 8

    为什么在PHP中会有一个字符串> ='0'?

  9. 9

    字符串末尾的空字符'\ 0'

  10. 10

    为什么有人会写一个字符串someString =“” + Convert.toChar(0)而不是someString =“ 0”

  11. 11

    为什么对memset使用'\ 0'而不是0?

  12. 12

    为什么对memset使用'\ 0'而不是0?

  13. 13

    PHP + JavaScript:将空字符串与0进行比较时幕后发生了什么

  14. 14

    空字符串和'\ 0'char有什么区别?(从指针和数组的角度来看)

  15. 15

    为什么我的X11转发尝试失败并显示“ connect /tmp/.X11-unix/X0:没有这样的文件或目录”?

  16. 16

    为什么 x^(-1/0) = 0

  17. 17

    为什么这个React组件返回字符串'0'

  18. 18

    为什么hexdump将0x0A解析为一个点?

  19. 19

    为什么x [0]!= x [0] [0]!= x [0] [0] [0]?

  20. 20

    为什么BSON字符串(不是Cstring / ename)后面的0x00字节结尾?

  21. 21

    为什么结果是 0x18 而不是 0x12?

  22. 22

    在arm64汇编中,“ adrp x0,idmap_pg_dir;”是什么?指示是什么意思?

  23. 23

    子进程Popen返回一个空字符串,作为communication()[0] .split('\ n')上的最后一个列表成员

  24. 24

    对于Tmax(0x7fffffff)一个奇怪的问题,为什么(!x)== x?

  25. 25

    为什么函数会在Java中修改array [0]而不是字符串?

  26. 26

    为什么串联两个空字符串会导致一个空字符串?

  27. 27

    为什么输出显示0而不是0.0?

  28. 28

    为什么!0等于1而不是-1?

  29. 29

    为什么变量 y 是 0,不是 2?

热门标签

归档