首页 > 解决方案 > echo `echo \\\\\\\z` 如何导致 \\z?

问题描述

我试图理解这种行为:

bash-5.1$ echo `echo \\\\\\\z`
\\z

对于内部 echo 命令,第一个转义字符 ( \) 将转义前导转义字符(第二个转义字符),并以第 3 个转义第 4 个转义和第 5 个转义第 6 个重复。第 7 个转义字符不应该转义前导 z 字符,导致\\\z在外部回声的影响下会导致\z作为答案吗?

注意: - 如果最后一个 \ 不会逃脱 z (这可​​能是我从看到答案中假设的可能情况),那为什么呢?

标签: linuxbashshellescapingecho

解决方案


echo `echo \\\\\\\z`结果如何\\z

语法树如下所示:

- echo-> `-> echo->\\\\\\\z

我们从\\\\\\\z. 首先https://www.gnu.org/software/bash/manual/html_node/Escape-Character.html#Escape-Character发生:

不带引号的反斜杠 '\' 是 Bash 转义字符。它保留了 [...] 之后的下一个字符的文字值

是未引用的\\\\\\z,因此我们将每一对转换\??, like \\into\\zinto z

\\\\\\\z
^^|||||| -> \
  ^^|||| -> \
    ^^|| -> \
      ^^ -> z

- echo-> `-> echo->\\\z

然后出现反引号,这是首选命令替换`...`的原因之一。$(..)来自https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着“$”、“`”或“\”。

\\\z第一个\后面是\,所以它的意思不是字面的。第一个的意思\是,和上一点一样,它保留下一个字符的字面值。所以,基本上,\\被单个\. 其余\z的按字面意思保留。

\\\z
^^    -> \
  ..  -> \z

- echo-> `-> echo->\\z

然后echo '\\z'执行,它输出\\z并且命令替换`...`被内部命令的输出替换,所以,好吧,由\\z.

- echo->\\z

然后echo '\\z'再次输出\\z


推荐阅读