有两种用于命令替换的语法:带美元括号和带反引号的
。运行top -p $(pidof init)top -p `pidof init`给出相同的输出。这两种做同一件事的方式还是不同?

评论

另请参阅:BashFAQ / 082。

有一秒钟我以为这是一个jQuery问题。

结果可能取决于外壳-两者都支持。

#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