2013-04-12 19 views
7
> echo 0 
0 
> echo \0 
0 
[email protected]:~ 
> echo \\0 

[email protected]:~  
> echo "\\0" 
        # <--- What!!? 
[email protected]:~ 
> echo \\\0 

[email protected]:~ 
> echo "\\\0" 
\0 
[email protected]:~ 
> bash 
Executing .bashrc 
$ echo "\0" 
\0 
$ echo "\\0" 
\0 
$ echo "\\\0" 
\\0 

我得说,bash的行为对我来说更有意义。为什么我必须输入“\ 0”才能在zsh中创建一个字符串“ 0”?

更多细节:

[email protected]:~ 
> echo "0" | hexdump -C 
00000000 30 0a            |0.| 
00000002 
[email protected]:~ 
> echo "\0" | hexdump -C 
00000000 00 0a            |..| 
00000002 
[email protected]:~ 
> echo "\\0" | hexdump -C 
00000000 00 0a            |..| 
00000002 
[email protected]:~ 
> echo "\\\0" | hexdump -C 
00000000 5c 30 0a           |\0.| 
00000003 
[email protected]:~ 
> echo "\\\\0" | hexdump -C 
00000000 5c 30 0a           |\0.| 
00000003 
[email protected]:~ 
> echo "\\\\\0" | hexdump -C 
00000000 5c 00 0a           |\..| 
00000003 
[email protected]:~ 
> echo "\\\\\\0" | hexdump -C 
00000000 5c 00 0a           |\..| 
00000003 
[email protected]:~ 
> echo "\\\\\\\0" | hexdump -C 
00000000 5c 5c 30 0a          |\\0.| 
00000004 

最大的问题是,有没有产生两个bash和zsh中所期望的结果\0值。

更新:

[email protected]:~ 
> echo '0' | hexdump -C 
00000000 30 0a            |0.| 
00000002 
[email protected]:~ 
> echo '\' | hexdump -C 
00000000 5c 0a            |\.| 
00000002 
[email protected]:~ 
> echo '\\' | hexdump -C 
00000000 5c 0a            |\.| 
00000002 
[email protected]:~ 
> echo \\ | hexdump -C 
00000000 5c 0a            |\.| 
00000002 
[email protected]:~ 
> echo '\\0' | hexdump -C 
00000000 5c 30 0a           |\0.| 
00000003 

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

+0

echo“\\”给出了什么?单引号也值得一试:echo'\ 0' – catholicon

回答

3

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

echo -E '\0'应该在zsh和bash(和破折号)上产生一个\0

1

这是标准的(读便携式)的方式来做到这一点:

printf "\0" 

应工作无论(类似Unix)操作系统,无论外壳。

相关问题