我将 Ubuntu 16.04 与 Bash 一起使用,我试图在Wikipedia、here和here中阅读,但我无法理解 shell 脚本中“命令替换”的含义,尤其是在 Bash 中,如下所示:
$(command)
或者
`command`
这个词的含义是什么?
编辑:当我第一次发布这个问题时,我已经知道了替换的纯概念以及变量替换的 Linux 概念(通过执行用它的值替换变量),但是我仍然错过了文档中这个 shell 功能的目的原因或一组原因。
问题锁定后我的回答
命令替换是一种具有专用语法的操作,用于执行命令并让该命令的输出由变量保持(存储)以供以后使用。
一个例子date
:
thedate="$(date)"
然后我们可以使用命令打印结果printf
:
printf 'The date is %s\n' "$thedate"
- 命令替换语法是
$()
. - 命令本身是
date
. - 结合我们得到
$(date)
的,它的值是替换的结果(我们可以在执行后得到)。 - 我们将该值保存在变量 中
$thedate
,以备后用。 printf
根据上面的命令,我们用 显示变量保存的输出值。
注意:\n
inprintf
是换行符。
“命令替换”是 shell 语言功能的名称,它允许您执行命令并让该命令的输出替换(替换)命令的文本。
Shell 语言没有其他功能可以让您这样做。
命令替换,即整个
$(...)
表达式,被它的输出替换,这是命令替换的主要用途。命令替换执行的命令在子 shell 中执行,这意味着它有自己的环境,不会影响父 shell 的环境。
不过,并非所有子 shell 执行都是命令替换(请参阅末尾的更多示例)。
显示在子 shell 中执行命令替换的示例:
在这里,变量
s
被设置为字符串123
。在下一行,echo
在包含命令替换结果的字符串上调用。命令替换设置s
为字符串world
并回显该字符串。该字符串world
是命令替换中命令的输出,因此,如果在 下运行set -x
,我们会看到上面的第二行将扩展为echo 'hello world'
,这会hello world
在终端上产生:(在跟踪输出中的每个级别的命令替换子外壳中
bash
添加额外级别的+
提示,其他外壳可能不会这样做)最后,我们展示了命令替换中的命令是在它自己的子 shell 中运行的,因为它不影响
s
调用 shell 中的值(的值s
仍然是123
,不是world
)。在其他情况下,命令在子 shell 中执行,例如
在
bash
中,除非您设置lastpipe
选项(仅在非交互式实例中),否则将read
在子 shell 中执行,这意味着$message
在父 shell 中不会更改,即echo "$message"
在上述命令之后执行将回显一个空字符串(或任何值$message
以前)。进程替换
bash
也在子shell中执行:这也不同于命令替换。
将结果值存储
command
到变量中。真的没有更多了。
作为旁注,我相信:
已被弃用,其含义与上述相同。