Bagaimana echo
dan printf
memperlakukan backslashes di zsh
, bash
dan kerang lainnya?
Di bawah zsh saya mendapatkan perilaku berikut:
$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz
Di bawah bash , segalanya tampak sedikit lebih konsisten:
bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$
Tetapi yang lebih konkret: Bagaimana saya bisa meneruskan string yang mengandung garis miring terbalik seperti\\foo\bar\something
ke:
echo
printf
print
dan mendapatkan string yang sama persis? (dalam zsh
dan bash
)?
Berikut ini eksperimen lain dengan fungsi di zsh:
function foo
{
echo -E '$1'
}
$ foo \\here\is\some\path
$1
Bagaimana saya bisa mencetaknya \\here\is\some\path
?
Pembaruan (Catatan: ini sekarang telah dijawab dalam komentar Stephane)
Saya sudah mencoba yang berikut ini di zsh 5.0.2:
function foo
{
printf '$s\n' $1
}
foo '\\some\path'
Tapi ini dicetak $s
?
'
dengan "
, dan aktifkan dengan: foo '\\ here \ is \ some \ path' (jika tidak, shell pemanggil mendapat kesempatan untuk menafsirkan '\' sebelum mereka sampai ke fungsinya)
'$s\n'
saat seharusnya digunakan '%s\n'
.
printf
,echo
tidak portabel dalam hal ini.