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

var=$(command)

or

var=`command`

这两种方法有什么区别?


当前回答

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

注意这种行为:

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

你会得到以下结果:

$A
A_VARIABLE

 

其他回答

除了可以在命令中使用哪些非转义字符之外,两者几乎没有区别。你甚至可以用‘……的命令(反之亦然),用于更复杂的两级深层命令替换。

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

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

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

还请参阅POSIX规范以获得关于各种差异的详细信息。

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

注意这种行为:

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

你会得到以下结果:

$A
A_VARIABLE

 

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

反引号形式是命令替换的传统方法,POSIX支持这种形式。 然而,除了最简单的用途之外,所有的用途都很快变得复杂起来。 特别是,需要嵌入命令替换和/或双引号的使用 小心使用反斜杠字符转义。

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

我们更喜欢$(…)用于命令替换;不像' ',它能正确地筑巢。 伯恩从一开始就应该这么拼,但不幸的是,他没有这么拼。

thiton评论道:

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


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

参见Elia Pinto (devzero2000)(2016年1月12日)提交的commit ec1b763、commit 9c10377、commit c7b793a、commit 80a6b3f、commit 9375dcf、commit e74ef60、commit 27fe43e、commit 2525c51、commit becd67f、commit a5c98ac、commit 8c311f9、commit 57da049、commit 1d9e86f、commit 78ba28d、commit efa639f、commit 1be2fa0、commit 38e9476、commit 8823d2f、commit 32858a0、commit cd914d8。 (由Junio C Hamano—gitster—在commit e572fef中合并,2016年1月22日)

从Git 2.8开始,所有代码都是$(…),不再有'…'。

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

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

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

`echo \`foo\`` 

相对于:

$(echo $(foo))