【问题标题】:Why can back-quotes and $() for command substitution result in different output? [duplicate]为什么命令替换的反引号和 $() 会导致不同的输出? [复制]
【发布时间】:2016-03-13 01:59:15
【问题描述】:

谁能解释Linux中``(反引号)和$()之间的区别? 非常感谢!

到现在,我才发现:

$echo `echo \\\\ `
\
$echo $(echo \\\\ )
\\

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    记录在man bash:

    当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着 $`\。前面没有反斜杠的第一个反引号终止命令替换。使用$(command) 表单时,所有 括号之间的字符组成命令;没有人受到特殊对待。

    更重要的区别在于它们的嵌套方式:

    echo $(echo $(echo a))
    echo `echo `echo a``   # Wrong
    echo `echo \`echo a\``
    

    【讨论】:

    • 引用,但没有来源... 快速谷歌搜索表明来源是 Bash 参考手册,但问题不是 Bash 特定的。在这里引用 Shell 命令语言规范的 section 会更合适。
    【解决方案2】:

    反引号(``) 和 $() 都可以用于命令替换,但它们有细微的区别。

    以问题中提到的案例为例:

    $echo `echo \\\\ `
    

    第一个和第三个“\”将被视为转义,echo \\\\ 将被评估为“\\”

    因此,上面的命令等于:

    $echo \\
    

    并且第一个反斜杠被视为转义,所以输出为:

    \
    

    在 $() 的情况下,有一点小技巧,在 $() 内部计算的内容将作为参数传递到外部命令。

    举个例子:

    $echo $(echo \\\\ )
    

    $() 中的内容被评估为“\\”,这与前面的情况相同。不同的是,“\\”会直接传递给外部的echo命令,第一个反斜杠不会被当成转义符。

    因此我们会得到输出:

    \\
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多