2013-04-12 18 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 

Muszę powiedzieć, że zachowanie Basha ma dla mnie dużo więcej sensu.Dlaczego muszę wpisać "\ 0", aby utworzyć ciąg " 0" w zsh?

Więcej szczegółów:

[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 

Największym problemem jest to, że nie ma wartości, które daje pożądanego rezultatu \0 zarówno bash i zsh.

Aktualizacja:

[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 

Wygląda użyciu apostrofów pomaga uzyskać spójne zachowanie. Chciałbym, żeby ktoś wyjaśnił zachowanie za pomocą podwójnych cytatów.

+0

co daje echo "\\"? Warto również wypróbować pojedyncze cytaty: echo "\ 0" – catholicon

Odpowiedz

3

Użyj pojedynczych cudzysłowów i wyłącz obsługę ewakuacji w echo z flagą -E.

echo -E '\0' powinien wytworzyć \0 zarówno na zsh, jak i bash (i dash).

1

Jest to standardowy (odczyt przenośny) sposób to zrobić:

printf "\0" 

Powinna działać bez względu na (jak Unix) OS, bez względu na powłokę.

Powiązane problemy