Làm thế nào để echo
và printf
backslashes món đặc sản ở zsh
, bash
và vỏ khác?
Theo zsh tôi nhận được các hành vi sau:
$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz
Trong bash , mọi thứ có vẻ phù hợp hơn một chút:
bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$
Nhưng cụ thể hơn: Làm thế nào tôi có thể vượt qua một chuỗi chứa dấu gạch chéo ngược như\\foo\bar\something
:
echo
printf
print
và nhận được chính xác cùng một chuỗi? (trong zsh
và bash
)?
Đây là một thử nghiệm khác với các chức năng trong zsh:
function foo
{
echo -E '$1'
}
$ foo \\here\is\some\path
$1
Làm thế nào tôi có thể có nó chỉ in \\here\is\some\path
?
Cập nhật (Lưu ý: điều này hiện đã được trả lời trong bình luận của Stephane)
Tôi đã thử như sau trong zsh 5.0.2:
function foo
{
printf '$s\n' $1
}
foo '\\some\path'
Nhưng bản in này $s
?
'
bằng "
và gọi nó bằng: foo '\\ here \ is \ some \ path' (nếu không, shell invoke có cơ hội diễn giải '\' trước khi chúng vào hàm)
'$s\n'
khi cần sử dụng '%s\n'
.
printf
,echo
không phải là di động trong vấn đề này.