跨壳的反斜杠处理

Ame*_*ina 11 shell bash zsh quoting

如何处理echoprintf处理zsh,bash和其他 shell 中的反斜杠?

zsh 下,我得到以下行为:

$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz
Run Code Online (Sandbox Code Playgroud)

bash 下,事情似乎更加一致:

bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$
Run Code Online (Sandbox Code Playgroud)

但更具体地说:如何传递包含反斜杠的字符串,例如\\foo\bar\something

  • echo
  • printf
  • print

并获得完全相同的字符串?(在zshbash)?

下面是另一个 zsh 函数的实验:

function foo
{
    echo -E '$1'
}

$ foo \\here\is\some\path
$1
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它打印出来\\here\is\some\path

更新(注意:现在已经在 Stephane 的评论中回答了这个问题)

我在 zsh 5.0.2 中尝试了以下内容:

function foo
{
    printf '$s\n' $1 
}

foo '\\some\path'
Run Code Online (Sandbox Code Playgroud)

但是这个打印$s

Sté*_*las 14

zsh echo以标准方式运行,就像bash在 UNIX 模式下一样。也就是说,它\b按照 UNIX 规范的要求扩展为 ASCII BS 字符。

不要echo用于显示任意字符串,请使用printf

printf '%s\n' "$1"
Run Code Online (Sandbox Code Playgroud)

print -r -- "$1"也有效,但是是ksh/zsh特定的。

echo -E - "$1"一起工作zsh,我相信一些BSD系统。

cat << EOF
$1
EOF
Run Code Online (Sandbox Code Playgroud)

可以在任何类似 Bourne 的 shell 中工作,即使是几十年前没有printf命令但它会产生一个新进程的shell ,现在真的没有必要,因为我们现在printf到处都有。

顺便说一下,您需要在 shell 命令行上转义反斜杠,因为它对 shell 来说是特殊的(每个 shell but rc),所以:

$ foo '\\foo\bar'
Run Code Online (Sandbox Code Playgroud)

foo \\foo\bar将传递无法重新发明丢失的反斜杠的"\foo\bar"字符串foo