命令替换有两种语法:带美元括号和带反引号。运行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 种方法”一章中做了一个测试。