shell编程中$(command)和`command`有什么区别?

时间:2011-01-16 22:34:37

标签: bash shell ksh sh

要将命令的输出存储为sh / ksh / bash中的变量,您可以执行任何操作

var=$(command)

var=`command`

两种方法之间有什么区别?

6 个答案:

答案 0 :(得分:250)

由于$()可以轻松地嵌套在$()中,因此{@ 1}}可以轻松地使用$(echo foo$(echo bar))替换反引号/ gravemarks。还有其他差异,例如在反引号/重做标记版本中如何解析反斜杠等。

请参阅BashFAQ/082,原因有几个,总是更喜欢$(...)语法。

另请参阅POSIX规范,了解有关各种差异的详细信息。

答案 1 :(得分:37)

他们的行为相同。区别在于语法:嵌套$()``更容易:

listing=$(ls -l $(cat filenames.txt))

VS

listing=`ls -l \`cat filenames.txt\``

答案 2 :(得分:25)

当使用较旧的反向标记形式时,反斜杠保留其字面含义,除非后跟$,`或\。第一个反斜杠前面没有反斜杠会终止命令替换。

使用较新的$(command)表单时,括号内的所有字符组成命令;没有人受到特别对待。

这两种形式都可以嵌套,但后面的种类需要以下形式。

`echo \`foo\`` 

相反:

$(echo $(foo))

答案 3 :(得分:25)

2014年7月:commit f25f5e6Elia Pinto (devzero2000),2014年4月,Git 2.0)增加了嵌套问题:

  

反引号表单是命令替换的传统方法,由POSIX支持   然而,除了最简单的用途外,其他所有用途都很快变得复杂   特别是,嵌入式命令替换和/或双引号的使用需要   小心逃避反斜杠字符

这就是git/Documentation/CodingGuidelines 提到的原因:

  

我们更喜欢$( ... )来替换命令; 与``不同,它恰当地嵌套   应该是Bourne从第一天开始拼写它的方式,但不幸的是不是。

thiton commented

  

这就是`echo `foo``因为每个``可以打开或关闭所固有的模糊性而无法正常工作的原因。   由于运气或特殊功能,它可能适用于特殊情况。


2016年1月更新:Git 2。8(2016年3月)完全摆脱了反击。

请参阅commit ec1b763commit 9c10377commit c7b793acommit 80a6b3fcommit 9375dcfcommit e74ef60commit 27fe43e,{{3} },commit 2525c51commit becd67fcommit a5c98accommit 8c311f9commit 57da049commit 1d9e86fcommit 78ba28dcommit efa639fcommit 1be2fa0commit 38e9476commit 8823d2fcommit 32858a0(2016年1月12日)commit cd914d8
(由Elia Pinto (devzero2000)Junio C Hamano -- gitster --合并,2016年1月22日)

从Git 2.8开始,全部是$(...),不再是`...`

答案 4 :(得分:5)

除了您可以在命令中使用的未转义字符外,没有什么区别。您甚至可以将`... 命令放在 $(...)之中(反之亦然),以进行更复杂的两级深度命令替换。< / p>

对反斜杠字符/运算符的解释略有不同。除此之外,当嵌套`... 替换命令时,您必须使用 \,转义内部`字符,而使用 $()它会自动理解嵌套。

答案 5 :(得分:0)

“两种方法之间有什么区别?”

请注意此行为:

A="A_VARIABLE"
echo "$(echo "\$A")"
echo "`echo "\$A"`"

您将获得以下结果:

$A
A_VARIABLE