问题:
要将命令的输出作为变量存储在 sh/ksh/bash 中,你可以执行以下任一操作
var=$(cmd)
或
var=`cmd`
这两种方法之间有什么区别?
回答:
它们的行为相同。反引号形式是传统的命令替换方法,由 POSIX 支持。然而,除了最简单的用途外,所有用途都很快变得复杂。尤其是,嵌入的命令替换和/或双引号的使用需要小心地使用反斜杠字符进行转义。
区别是 $()
比 `` 更易于嵌套。
var=$(echo foo$(echo bar))
比
var=`echo foo\`echo bar\``
的可读性更好。
在 Bash 中使用反引号有几点需要注意:
- 嵌套在反引号中的命令会在当前 shell 环境中执行,所以它可以修改环境变量、当前目录等。
- 如果内嵌命令成功执行但没有输出,反引号会被替换为空字符串。
- 你可以在反引号中使用变量,它们的值会在内嵌命令执行时扩展。
- 反引号中的命令不能以新行结束,必须在同一行。
- 与
$(...)
格式相比,反引号是 bash 的传统格式,但是$(...)
更清晰,更容易阅读和调试。
参考:
- stackoverflow question 4708549
- https://www.gnu.org/software/bash/manual/bash.html#Command-Substitution
相关阅读: