要将命令的输出存储为sh / ksh / bash中的变量,您可以执行任何操作
var=$(command)
或
var=`command`
两种方法之间有什么区别?
答案 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 f25f5e6(Elia Pinto (devzero2000
),2014年4月,Git 2.0)增加了嵌套问题:
反引号表单是命令替换的传统方法,由POSIX支持 然而,除了最简单的用途外,其他所有用途都很快变得复杂 特别是,嵌入式命令替换和/或双引号的使用需要 小心逃避反斜杠字符。
这就是git/Documentation/CodingGuidelines 提到的原因:
我们更喜欢
$( ... )
来替换命令; 与``不同,它恰当地嵌套 应该是Bourne从第一天开始拼写它的方式,但不幸的是不是。
这就是
`echo `foo``
因为每个``
可以打开或关闭所固有的模糊性而无法正常工作的原因。 由于运气或特殊功能,它可能适用于特殊情况。
2016年1月更新:Git 2。8(2016年3月)完全摆脱了反击。
请参阅commit ec1b763,commit 9c10377,commit c7b793a,commit 80a6b3f,commit 9375dcf,commit e74ef60,commit 27fe43e,{{3} },commit 2525c51,commit becd67f,commit a5c98ac,commit 8c311f9,commit 57da049,commit 1d9e86f,commit 78ba28d,commit efa639f, commit 1be2fa0,commit 38e9476,commit 8823d2f,commit 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