* export *从key = value文件到shell

时间:2015-09-24 12:35:08

标签: bash shell export

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

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的子节点。)

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

2 个答案:

答案 0 :(得分:31)

在采购文件之前运行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" 

答案 1 :(得分:-1)

问题是cat site.conf | while read assignment使用管道。

Pipes创建一个子shell,因此使用export创建的变量在子shell中创建,并且在当前shell中不可用。

你可以这样做:

source $HOME/site.conf
从您的~/.bashrc

导出所有变量,并在shell中使用它们。