要将命令的输出存储为sh / ksh / bash中的变量,您可以执行以下任一操作
var=$(command)
要么
var=`command`
两种方法之间有什么区别?
要将命令的输出存储为sh / ksh / bash中的变量,您可以执行以下任一操作
var=$(command)
要么
var=`command`
两种方法之间有什么区别?
Answers:
不推荐使用反引号/标记,$()
因为它$()
可以像在中一样轻易地嵌套在命令中,以代替命令$(echo foo$(echo bar))
。还有其他区别,例如反引号/标记版本中反斜杠的解析方式等。
出于多种原因,请参阅BashFAQ / 082,以始终首选使用$(...)语法。
另请参阅POSIX规范以获取有关各种差异的详细信息。
$(...)
-只是将它们引为备选。
"the backquoted variety of command substitution is not recommended"
这只是说不赞成IMHO的长篇大论
$(...)
为替代方法。反引号没有已知的实现错误,但是有许多已知的实现错误$(...)
。因此,对于可移植性问题,建议对非嵌套呼叫使用反引号。$(...)
需要一个递归解析器,但是未与引入该功能的ksh86一起使用。在in-ulm.de/~mascheck/various/cmd-subst中 查看正确的实现列表。合格的外壳需要支持除情况D.2之外的所有情况。
deprecated
,例如,使用waitpid()
that会阻止您从exit()
参数中看到完整的32位,但是除最近的Bourne Shell之外的所有Shell仍使用waitpid()
而不是waitid()
现在可用的调用,因为26年
它们的行为相同。区别是语法上的:嵌套$()
比``
:
listing=$(ls -l $(cat filenames.txt))
与
listing=`ls -l \`cat filenames.txt\``
echo $(echo \$abc)
是不一样的echo `echo \$abc`
- $(echo \`)
和 $(echo \\)
echo foo `#comment`
vs echo foo $(#comment)
。第二个不起作用。(用于在多行命令中进行注释。)
2014年7月:提交f25f5e6(由Elia Pinto(devzero2000
),2014年4月,Git 2.0)增加了嵌套问题:
反引号形式是命令替换的传统方法,并且受POSIX支持。
但是,除最简单的用途外,所有其他用途都会迅速变得复杂。
特别地,嵌入式命令替换和/或双引号的使用要求使用反斜杠字符进行仔细的转义。
这就是为什么git / Documentation / CodingGuidelines提到:
我们更喜欢
$( ... )
命令替换;与``不同,它正确嵌套。
从第一天开始,它就应该是伯恩(Bourne)拼写的方式,但不幸的是事实并非如此。
这就是为什么
`echo `foo``
由于固有的含糊性而通常无法正常工作的原因,因为每个模糊性都``
可以打开或关闭。
由于运气或特殊功能,在某些特殊情况下可能会起作用。
2016年1月更新:Git 2.8(2016年3月)完全摆脱了反引号。
见提交ec1b763,提交9c10377,提交c7b793a,提交80a6b3f,提交9375dcf,提交e74ef60,提交27fe43e,提交2525c51,提交becd67f,提交a5c98ac,提交8c311f9,提交57da049,提交1d9e86f,提交78ba28d,提交efa639f,提交1be2fa0,提交38e9476,提交8823d2f,提交32858a0,提交cd914d8(2016年1月12日),作者:Elia Pinto(devzero2000
)。
(由Junio C gitster
Hamano合并--在commit e572fef中,2016年1月22日)
从Git的2.8起,它是所有$(...)
,没有更多的`...`
。
$()
也是POSIX指定的-用引号将反引号描述为“受POSIX支持”,以暗示这对他们来说是独一无二的。它是POSIX Bourne之前(1970年代)唯一支持的反引号语法。