linux - echo `echo \\\\\\\z` 如何导致 \\z?
问题描述
我试图理解这种行为:
bash-5.1$ echo `echo \\\\\\\z`
\\z
对于内部 echo 命令,第一个转义字符 ( \
) 将转义前导转义字符(第二个转义字符),并以第 3 个转义第 4 个转义和第 5 个转义第 6 个重复。第 7 个转义字符不应该转义前导 z 字符,导致\\\z
在外部回声的影响下会导致\z
作为答案吗?
注意: - 如果最后一个 \ 不会逃脱 z (这可能是我从看到答案中假设的可能情况),那为什么呢?
解决方案
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\
和\z
into 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
。
推荐阅读
- vba - 我创建的 FSO 文本文件不会关闭,并且损坏了我的应用程序
- html - 图像采用所有可用高度并将兄弟元素踢出父级
- npm - 更新 package.json 中的次要版本
- azure - 是否可以使用 REST API 端点访问 Azure Synapse 中专用 SQL 池中的表中的数据?
- makefile - makefile最后一个目标没有被执行
- node.js - Express-session:如何添加用户详细信息以表达会话 TypesScript
- spring-messaging - 使用 Spring 的 RSocketRequester 正确使用 LoadbalanceRSocketClient
- javascript - Vue 2.X - 在组件中等待对比异步数据源的好方法
- python - Pandas 按列列表过滤
- docker-compose - 如何构建具有 telnet 客户端的 docker 映像