为什么我必须输入“\\\ 0”才能在zsh中创建字符串“\ 0”?

时间:2013-04-12 21:04:01

标签: linux bash shell unix zsh

> echo 0
0
> echo \0
0
slu@dev:~
> echo \\0

slu@dev:~    
> echo "\\0"
                   # <--- What!!?
slu@dev:~
> echo \\\0

slu@dev:~
> echo "\\\0"
\0
slu@dev:~
> bash
Executing .bashrc
$ echo "\0"
\0
$ echo "\\0"
\0
$ echo "\\\0"
\\0

我得说,bash的行为对我来说更有意义。

更多详情:

slu@dev:~
> echo "0" | hexdump -C
00000000  30 0a                                             |0.|
00000002
slu@dev:~
> echo "\0" | hexdump -C
00000000  00 0a                                             |..|
00000002
slu@dev:~
> echo "\\0" | hexdump -C
00000000  00 0a                                             |..|
00000002
slu@dev:~
> echo "\\\0" | hexdump -C
00000000  5c 30 0a                                          |\0.|
00000003
slu@dev:~
> echo "\\\\0" | hexdump -C
00000000  5c 30 0a                                          |\0.|
00000003
slu@dev:~
> echo "\\\\\0" | hexdump -C
00000000  5c 00 0a                                          |\..|
00000003
slu@dev:~
> echo "\\\\\\0" | hexdump -C
00000000  5c 00 0a                                          |\..|
00000003
slu@dev:~
> echo "\\\\\\\0" | hexdump -C
00000000  5c 5c 30 0a                                       |\\0.|
00000004

最大的问题是没有值可以在bash和zsh上产生所需的结果\0

更新:

slu@dev:~
> echo '0' | hexdump -C
00000000  30 0a                                             |0.|
00000002
slu@dev:~
> echo '\' | hexdump -C
00000000  5c 0a                                             |\.|
00000002
slu@dev:~
> echo '\\' | hexdump -C
00000000  5c 0a                                             |\.|
00000002
slu@dev:~
> echo \\ | hexdump -C
00000000  5c 0a                                             |\.|
00000002
slu@dev:~
> echo '\\0' | hexdump -C
00000000  5c 30 0a                                          |\0.|
00000003

使用单引号看起来有助于获得一致的行为。我希望有人能用双引号来解释这种行为。

2 个答案:

答案 0 :(得分:3)

使用单引号并使用-E标志关闭echo中的转义处理。

echo -E '\0'应在zsh和bash(以及短划线)上生成\0

答案 1 :(得分:1)

这是标准的(可读取的)方式:

printf "\0"

无论是什么类型的操作系统,都应该工作。