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