*export*从key = value文件到shell的所有变量

uml*_*ute 20 bash shell export environment-variables

如果我想将环境变量继承到子进程,我会执行以下操作:

export MYVAR=tork
Run Code Online (Sandbox Code Playgroud)

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

EMAIL="dev@example.com"
FULLNAME="Master Yedi"
FOO=bar
Run Code Online (Sandbox Code Playgroud)

现在我想在每次打开一个新shell时处理这个文件(例如,在~/.bashrcor中有一些代码~/.profile),这样从新打开的shell中启动的任何进程都将通过环境变量继承赋值.

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

我试过类似的东西

cat site.conf | while read assignment
do
  export "${assignment}"
done
Run Code Online (Sandbox Code Playgroud)

但由于各种原因(最重要的export是在子shell中执行,因此该变量永远不会导出到调用shell的子节点),这不起作用.

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

che*_*ner 36

set -a在采购文件之前运行.这将标记自动导出的所​​有新变量和修改变量.

set -a
source site.conf
set +a  # Require export again, if desired.
Run Code Online (Sandbox Code Playgroud)

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

while read assignment; do
  export "$assignment"
done < site.conf
Run Code Online (Sandbox Code Playgroud)

但是,如果(虽然不太可能)您在一行上有多个赋值,例如

EMAIL="dev@example.com" FULLNAME="Master Yedi" 
Run Code Online (Sandbox Code Playgroud)