在shell编程中,$(command)和' command '有什么区别?

要将命令的输出作为一个变量存储在sh/ksh/bash中,您可以使用任何一种方法

var=$(command)

var=`command`

这两种方法有什么区别?

60613 次浏览

除了可以在命令中使用哪些非转义字符之外,两者几乎没有区别。你甚至可以把“……”命令放在美元(…)命令中(反之亦然),以实现更复杂的两级命令替换。

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

由于$()可以像在$(echo foo$(echo bar))中那样容易地嵌套在自己内部,因此反勾号/重号标记已被弃用,而支持$()进行命令替换。还有其他不同之处,比如反斜杠在反标记/墓碑版本中的解析方式,等等。

请参阅< >强BashFAQ / 082 < / >强,了解始终偏爱$(…)语法的几个原因。

也可以查看< >强POSIX < / >强规范以获得关于各种不同的详细信息。

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

当使用较新的$(command)形式时,括号之间的所有字符组成命令;没有人被特别对待。

这两种形式都可以嵌套,但反标记形式需要以下形式。

`echo \`foo\``

相对于:

$(echo $(foo))

它们的行为是一样的。区别在于语法:嵌套$()比嵌套``更容易:

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

vs。

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

2014年7月:提交f25f5e6 (by Elia Pinto (devzero2000), 2014年4月,Git 2.0)增加了嵌套问题:

反引号形式是POSIX支持的命令替换的传统方式 然而,除了最简单的用途外,所有的用途都会很快变得复杂 特别是,需要嵌入命令替换和/或双引号的使用 小心逃跑的反斜杠字符< /强>。< / p >

这就是为什么git /文档/ CodingGuidelines提到:

我们更喜欢$( ... )命令替换;不像' ',它能正确地筑巢。< br > 这应该是伯恩从第一天开始的拼写方式,但不幸的是,它不是

thiton 评论:

这就是为什么`echo `foo``一般不会工作的原因,因为固有的模糊性,因为每个__abc1可以打开或关闭 它可能适用于由于运气或特殊特征的特殊情况

2016年1月更新:Git 2.8(2016年3月)完全摆脱了反勾号。

< p >看到提交ec1b763 提交9 c10377提交c7b793a 提交80年a6b3f, 提交9375年贴现, 提交e74ef60, 提交27 fe43e, 提交2525 c51, 提交becd67f, 提交ec1b7630, 提交ec1b7631, 提交ec1b7632, 提交ec1b7633, 提交ec1b7634, 提交ec1b7635, 提交ec1b7636, 提交ec1b7637, 提交ec1b7638, 提交ec1b7639, 提交9 c103770 提交9 c103771(2016年1月12日)。< br > (由Junio C Hamano—gitster in 提交e572fef合并,2016年1月22日)

从Git 2.8开始,它都是$(...),不再是`...`

“这两种方法有什么不同吗?”

注意这种行为:

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

你会得到以下结果:

$A
A_VARIABLE

,