it-swarm.cn

$(stuff)和`stuff`有什么区别?

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

270
tshepang

旧式反引号_` `_确实会处理反斜杠,并且嵌套有点不同。新型$()将_( )_之间的所有内容解释为命令。

_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 [〜#〜] 符合标准的shell。
mouviciel 指出,老式_` `_对于较旧的外壳可能是必需的。

除技术角度外,旧式_` `_在视觉上也有缺点:

  • 很难注意到:I like $(program) better than `program`
  • 容易与单引号混淆:_'`'`''`''`'`''`'_
  • 键入不太容易(甚至可能不在键盘的标准布局上)

(SE出于自己的目的使用_` `_,写这个答案很痛苦:)

364
wag

我观察到的明显区别是,您不能嵌套反引号,而可以嵌套$()。也许两者都是出于遗留原因而存在。同样,.source命令是同义词。

41
balki

$()不适用于旧的Bourne Shell。但这已经 年份 自从我与旧的Bourne Shell合作以来已有几十年了。

28
mouviciel

另一个要注意的是,$()将比使用反引号使用更多的系统资源,但是速度稍快一些。

Mastering Unix Shell scripting 中,Randal K. Michael在名为“逐行处理文件的24种方法”的一章中进行了测试。

6
cuonglm

要添加其他人在此处所说的内容,您可以使用反引号来模拟内联注释:

echo foo `# I'm a comment!` bar

输出为:foo bar

有关更多信息,请参见以下内容: https://stackoverflow.com/a/12797512 (另请注意该帖子下方的评论。)

5
phk

$()语法不适用于旧的bourne Shell。
对于较新的shell,_` `_和$()是等效的,但是当您需要嵌套多个命令时,使用$()更为方便。

例如 :

_echo $(basename $(dirname $(dirname /var/adm/sw/save )))
_

比:更容易键入和调试:

_echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
_
1
Emmanuel