Bash
跨殼處理反斜杠
如何處理
echo
和處理,和其他 shellprintf
中的反斜杠?zsh``bash
在zsh下,我得到以下行為:
$ echo "foo\bar\baz" foaaz $ echo "foo\\bar\\baz" foaaz $ echo 'foo\bar\baz' foaaz $ echo 'foo\\bar\\baz' foo\bar\baz
在bash下,事情似乎更加一致:
bash$ echo "foo\bar\baz" foo\bar\baz bash$ echo 'foo\bar\baz' foo\bar\baz bash$
但更具體地說:如何傳遞包含反斜杠的字元串,例如
\\foo\bar\something
:
echo
printf
並得到完全相同的字元串?(在
zsh
和bash
)?這是 zsh 中的另一個函式實驗:
function foo { echo -E '$1' } $ foo \\here\is\some\path $1
我怎樣才能讓它列印出來
\\here\is\some\path
?更新(注意:這已經在斯蒂芬的評論中得到了回答)
我在 zsh 5.0.2 中嘗試了以下內容:
function foo { printf '$s\n' $1 } foo '\\some\path'
但這列印
$s
?
zsh
echo
行為標準方式,如bash
在 UNIX 模式下。也就是說,它\b
按照 UNIX 規範的要求擴展為 ASCII BS 字元。printf '%s\n' "$1"
print -r -- "$1"
也可以,但是是ksh
/zsh
特定的。
echo -E - "$1"
使用zsh
並且我相信一些 BSD。cat << EOF $1 EOF
可以在任何類似 Bourne 的 shell 中工作,即使是幾十年前沒有
printf
命令但它產生一個新程序的 shell,而且現在真的沒有必要,因為我們現在printf
到處都有。順便說一句,您需要在 shell 命令行上轉義反斜杠,因為它對 shell 是特殊的(除了 之外的每個 shell
rc
),所以:$ foo '\\foo\bar'
foo \\foo\bar
會將無法重新發明失去的反斜杠的"\foo\bar"
字元串傳遞回去。foo