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

tsh*_*ang 283 command-line shell command-substitution

命令替换有两种语法:美元括号和反引号。运行top -p $(pidof init)top -p `pidof init`给出相同的输出。这两种做同样事情的方式,还是有区别?

wag*_*wag 382

旧式反引号` `确实处理反斜杠和嵌套有点不同。新式$()将两者之间的所有内容解释( )为命令。

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
Run Code Online (Sandbox Code Playgroud)

如果嵌套反引号被转义,则有效:

echo `uname | \`echo cat\``
Linux
Run Code Online (Sandbox Code Playgroud)

反斜杠乐趣:

echo $(echo '\\')
\\

echo `echo '\\'`
\
Run Code Online (Sandbox Code Playgroud)

新样式$()适用于所有符合POSIX标准的 shell。
正如mouviciel指出的那样,旧` `壳可能需要旧式。

除了技术角度,老式` `还有视觉上的劣势:

  • 难以察觉: I like $(program) better than `program`
  • 容易与单引号混淆: '`'`''`''`'`''`'
  • 不太容易打字(甚至可能不是在键盘的标准布局上)

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

  • 我唯一要补充的是,我称 '(' 为括号,而不是括号(即 '[')。 (11认同)
  • @Sam:`{ }` 通常被称为“大括号”或“大括号” http://en.wikipedia.org/wiki/Braces_(punctuation)#Braces (6认同)
  • 我也将 '{' 称为花括号。虽然看起来很奇怪,如果你把其他东西称为括号,你需要添加限定词“卷曲”......我想这只是因为它们实际上是卷曲的。 (2认同)

bal*_*lki 42

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

  • 这不是真的。您可以将反引号嵌套到任何级别,只是更痛苦。请注意,`$(...)` 和 `\`...\`` 都是标准的(后者已被弃用),而 `.` 是标准的,但不是 `source` (15认同)
  • 一些 Bourne 派生的 shell 无法识别 `source`。Dash 就是一个例子。 (10认同)
  • 更正,只有在`(t)csh`中不能嵌套。`(t)csh` 不支持 `$(...)`。不过他们确实支持`source`(而不是`.`)。 (3认同)

mou*_*iel 31

$()不适用于旧的 Bourne shell。但它已经多年,因为我老Bourne shell的工作几十年。


phk*_*phk 9

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

echo foo `# I'm a comment!` bar
Run Code Online (Sandbox Code Playgroud)

输出是:foo bar

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


cuo*_*glm 6

另请注意,$()与使用反引号相比,将使用更多的系统资源,但速度稍快。

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

  • 我倾向于同意@schily ...为什么需要更多资源? (3认同)
  • 这种说法是无稽之谈。没有理由为什么它应该更快,因为它只是为解析器使用了不同的符号。 (2认同)
  • @Wildcard,我想这是因为`$()` 使您的脚本比使用`\`` 时大一个字节(假设您没有嵌套它们并且不在其中使用反斜杠)。至于哪个解析速度更快,这会因外壳而异,并且与创建管道和分叉命令替换所需的进程的成本相比,可以忽略不计。 (2认同)