要将命令的输出作为一个变量存储在sh/ksh/bash中,您可以使用任何一种方法
var=$(command)
or
var=`command`
这两种方法有什么区别?
要将命令的输出作为一个变量存储在sh/ksh/bash中,您可以使用任何一种方法
var=$(command)
or
var=`command`
这两种方法有什么区别?
除了可以在命令中使用哪些非转义字符之外,两者几乎没有区别。你甚至可以用‘……的命令(反之亦然),用于更复杂的两级深层命令替换。
对反斜杠字符/操作符的解释略有不同。除此之外,当筑巢时……'替换命令时,必须使用\转义内部'字符,而使用$()替换时,它自动理解嵌套。
由于$()可以像$(echo foo$(回显条))那样容易地嵌套在自身内,因此反撇号/重音标记已被弃用,而改用$()进行命令替换。还有其他不同之处,比如反斜杠在反标记/墓碑版本中的解析方式,等等。
请参阅BashFAQ/082,了解始终偏爱$(…)语法的几个原因。
还请参阅POSIX规范以获得关于各种差异的详细信息。
当使用旧的反斜杠形式时,反斜杠保留其字面意义,除非后面跟着$、'或\。前面没有反斜杠的第一个反标记将终止命令替换。
当使用较新的$(命令)形式时,括号之间的所有字符组成命令;没有人被特别对待。
这两种形式都可以嵌套,但反标记形式需要以下形式。
`echo \`foo\``
相对于:
$(echo $(foo))
它们的行为是一样的。区别在于语法上:嵌套$()比嵌套' '更容易:
listing=$(ls -l $(cat filenames.txt))
vs.
listing=`ls -l \`cat filenames.txt\``
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开始,所有代码都是$(…),不再有'…'。
“这两种方法有什么不同吗?”
注意这种行为:
A="A_VARIABLE"
echo "$(echo "\$A")"
echo "`echo "\$A"`"
你会得到以下结果:
$A
A_VARIABLE