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

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

命令替换有两种语法:带美元括号和带反引号。运行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- 一致的外壳。
作为穆维西耶尔指出,旧式` `可能对于较旧的 shell 是必要的。

除了技术角度之外,旧式` `还有视觉上的缺点:

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

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

答案2

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

答案3

$()不适用于旧的 Bourne shell。但自从我使用旧的 Bourne shell 以来已经有几十年了。

答案4

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

掌握 Unix shell 脚本Randal K. Michael 在“逐行处理文件的 24 种方法”一章中做了一个测试。

相关内容