如果我想将环境变量继承给子进程,我会这样做:
export MYVAR=tork
假设我有一个文件
site.conf
,其中包含对变量的值(可以包含空格)的赋值:
EMAIL="[email protected]"
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
未知变量?
在获取文件之前运行
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="[email protected]" FULLNAME="Master Yedi"
对于 Zsh,我更喜欢以下内容:
function {
setopt LOCAL_OPTIONS allexport
local s='site.conf'
[ -f "$s" ] && source "$s"
}
自动执行的匿名函数语法使您能够灵活地在需要时声明局部变量。结合在函数范围内设置选项的能力 (
setopt LOCAL_OPTIONS
),您也不必担心这些选项在函数运行后会影响脚本的其余部分。