为什么 bash $() 可以设置环境变量?

Why can bash $() set environment variables?

来自Docker文档-https://docs.docker.com/installation/mac/#install-boot2docker,为什么$()可以设置环境变量

显示 Docker 客户端的环境变量。

$ boot2docker shellinit

要在 shell 中设置环境变量,请执行以下操作:

$ $(boot2docker shellinit)

我的问题是:为什么$(boot2docker shellinit)可以设置环境变量?

Why can $(boot2docker shellinit) set environment variables?

查看以下函数(但它可以是命令或脚本):

foo() { echo "export a=b"; }

这个命令只做一个:打印export a=b到标准输出:

$ foo() { echo "export a=b"; }
$ foo
export a=b

现在,command substitution 允许命令的输出替换命令本身。因此,如果您 运行 $(foo) 那么 Bash 将首先执行 foo 然后使用该命令的输出来构建命令。在我们的例子中,输出为 export a=b,Bash 将执行它:

$ declare -p a
bash: declare: a: not found
$ $(foo)
$ declare -p a
declare -x a="b"

$(command) 执行 command 的输出。所以 boot2docker 必须输出如下内容:

export env1=val1
export env2=val2
....
export envN=valN

boot2docker 为 运行 时显示环境变量的值,并在执行此输出时设置它们。