*导出*所有变量从 key=value 文件到 shell

*export* all variables from key=value file to shell

如果我想将环境变量继承给子进程,我会这样做:

export MYVAR=tork

假设我有一个文件 site.conf 包含对变量的赋值(可以包含空格):

EMAIL="dev@example.com"
FULLNAME="Master Yedi"
FOO=bar

现在,每当我打开一个新的 shell(例如,使用 ~/.bashrc~/.profile 中的一些代码)时,我想处理这个文件,以便任何进程都从中开始新开的shell会通过环境变量继承赋值

显而易见的解决方案是在 site.conf 中的每一行前加上一个 export 并只获取文件的来源。但是我不能这样做,因为文件也被其他一些应用程序(直接)读取,所以格式是固定的。

我试过

cat site.conf | while read assignment
do
  export "${assignment}"
done

但这行不通,原因有很多(最重要的是 export 在子 shell 中执行,因此变量永远不会导出到调用的子项shell).

有没有办法以编程方式 export bash 中的未知变量?

运行 set -a 在获取文件之前。这会标记所有新的和修改后的变量,以便自动导出。

set -a
source site.conf
set +a  # Require export again, if desired.

您观察到的问题是管道在子 shell 中执行 export。您可以简单地通过使用输入重定向而不是管道来避免这种情况。

while read assignment; do
  export "$assignment"
done < site.conf

但是,如果(尽管不太可能)您在一行上有多个分配,例如

,这将不起作用
EMAIL="dev@example.com" FULLNAME="Master Yedi"