为什么Bash中的此表达式不需要转义字符串?

时间:2018-09-24 17:52:44

标签: bash escaping

为什么这个表达式不需要转义字符串?

"$(dirname "${0}")"

在我看来,表达式实际上应该是这样:

"$(dirname \"${0}\")"

但是,我相信上述版本中的第一个表达式在没有\“的情况下仍然可以使用。

那是为什么?

2 个答案:

答案 0 :(得分:2)

根据man bash

  

Bash通过在子shell环境中执行命令并将命令替换替换为标准的输出来执行扩展。          命令,并删除所有尾随的换行符。

后来:

  

使用$(command)格式时,括号中的所有字符组成命令; 没有特殊待遇

  

如果替换出现在双引号内,则不会对结果进行单词拆分和路径名扩展。

因此嵌入式引号不会在同一外壳中同时评估。

  • 括号内的所有字符均在subshel​​l环境中评估
  • 有可选的外部引号来防止单词分裂路径名扩展

答案 1 :(得分:1)

$(...)启动新的引用上下文。命令替换

$(dirname "${0}")
首先评估

。产生的输出(而不是命令本身)由外部引号引起来。

(我不是完全 不确定如何处理"$(dirname \"${0}\")"。似乎在解析命令之前会发生某种形式的引号删除。)