。运行
top -p $(pidof init)
和top -p `pidof init`
给出相同的输出。这两种做同一件事的方式还是不同?#1 楼
旧式反引号` `
确实会处理反斜杠,并且嵌套有点不同。新型的$()
将命令中的所有内容解释为( )
。echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
如果嵌套的反引号被转义,则可以正常工作:
echo `uname | \`echo cat\``
Linux
反斜杠乐趣:
echo $(echo '\')
\
echo `echo '\'`
\
新型
$()
适用于所有符合POSIX的外壳。正如mouviciel指出的那样,旧的较旧的外壳可能需要
` `
样式。从技术角度来看,旧的
` `
还有一个视觉上的缺点:注意:
I like $(program) better than `program`
容易与单引号混淆:
'`'`''`''`'`''`'
不太容易键入(甚至在键盘的标准布局上也不容易)
(SE将
` `
用于自己的目的,写这个答案很痛苦:) 评论
我唯一要添加的是,我称呼'('括号,而不是方括号(即[[])。
–肯德尔·赫尔姆斯特·盖尔纳(Kendall Helmstetter Gelner)
2011年1月13日在18:09
@Kendall:在这里,我认为'{'是那些年来的左括号...
– SamB
2011年1月13日20:32
@Sam:{}通常称为en.wikipedia.org/wiki/Braces_(标点符号)#Braces
–约恩·舒德罗德
2011年1月13日在21:35
我还将“ {”称为花括号。虽然看起来很奇怪,但是如果您将其他内容放在方括号中,则需要添加“ curly”限定符...我想这只是因为它们实际上在卷曲。
–肯德尔·赫尔姆斯特·盖尔纳(Kendall Helmstetter Gelner)
2011年1月14日下午4:23
@slim我在美国/英国键盘上不知道,但是在西班牙键盘上`是一个死键,因此我必须输入两次反引号(通常我什至忘记了我可以做的)或反引号然后输入空格,即痛苦。
– Darkhogg
14年4月4日在16:39
#2 楼
我观察到的明显区别是,您不能嵌套反引号,而可以嵌套$()
。也许两者都是出于遗留原因而存在。同样,.
和source
命令是同义词。评论
有些Bourne衍生的外壳无法识别来源。短跑是一个例子。
–丹尼斯·威廉姆森
2011年1月13日在16:40
这不是真的。您可以将反引号嵌套到任何级别,但更加痛苦。注意$(...)和`...`是标准的(不推荐使用后者)。是标准但非来源
–StéphaneChazelas
2012年10月25日上午10:17
更正,只有在(t)csh中才可以嵌套它们。 (t)csh虽然不支持$(...)。他们确实支持源(而不是。)。
–StéphaneChazelas
2014年8月1日在12:28
仅当我们暗示“没有任何其他添加或修改,即不添加任何转义字符”时,“您不能嵌套反引号”才是准确的。但是我想(也基于反对意见和先前的赞成意见),这不是大多数人阅读的方式。澄清“在每个嵌套级别不添加适当的转义”将大大提高该答案的清晰度。
–fra-san
20-10-1在11:59
#3 楼
$()
不适用于旧的Bourne外壳。但是自从我使用旧的Bourne外壳以来已有数十年了。评论
早在1970年代和1980年代初期,对吗?
–克里斯托弗(Christopher)
19年10月1日在19:15
#4 楼
要添加其他人在此处所说的内容,您可以使用反引号来模拟内联注释:br />有关更多信息,请参见以下内容:https://stackoverflow.com/a/12797512(另请注意该帖子下方的评论。)
#5 楼
另一个要注意的是,$()
将比使用反引号使用更多的系统资源,但是速度更快。在掌握Unix shell脚本编写中,Randal K. Michael在名为“处理方法的24种方法”的一章中进行了测试。逐行文件”。
评论
这个说法是胡说八道。没有理由为什么它应该更快,因为它只是对解析器使用了不同的符号。
–schily
2015年9月6日下午13:17
@schily:也许,我只引用这本书,您可以阅读以获取更多详细信息。
–cuonglm
2015年9月6日15:19
我倾向于同意@schily ...为什么需要更多资源?
–通配符
16 Mar 7 '16 at 23:21
@Wildcard,我想这是因为$()使您的脚本比使用`时的脚本大一个字节(假设您不嵌套它们并且在其中不使用反斜杠)。至于哪一个解析起来更快,这在外壳之间会有所不同,并且与创建命令所需的创建管道和分叉过程的成本相比,可以忽略不计。
–StéphaneChazelas
16 Dec 2'在9:45
#6 楼
$()
语法不适用于旧版本的bourne shell。对于较新的shell,
` `
和$()
是等效的,但是当需要嵌套多个命令时,$()
更加方便使用。 例如:
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
比:
echo `basename \`dirname \\`dirname /var/adm/sw/save \\`\``
更容易键入和调试
评论
尽管$()看起来不错,但实现相关的解析器很麻烦,因为它需要双重递归解析器。
–schily
2015年9月6日下午13:18
@schily另一方面,如果没有良好的解析器,它将是一个shell。
–伊曼纽尔
2015年9月8日15:58
问题在于,在调用解析器之前,您需要知道字符串的结尾。对于反引号,这是相对简单的,但是对于括号来说,很难做到这一点,因为它们在外壳中用于各种目的。因此,您需要两次解析器,并且使用Bourne Shell中不存在的方式。
–schily
2015年9月8日于20:04
评论
另请参阅:BashFAQ / 082。有一秒钟我以为这是一个jQuery问题。
结果可能取决于外壳-两者都支持。