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

var=$(command)

or

var=`command`

这两种方法有什么区别?


当前回答

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

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

vs.

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

其他回答

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

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

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

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

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

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

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

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

`echo \`foo\`` 

相对于:

$(echo $(foo))

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

注意这种行为:

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

你会得到以下结果:

$A
A_VARIABLE

 

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

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

vs.

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