【问题标题】:*export* all variables from key=value file to shell*export* 所有变量从 key=value 文件到 shell
【发布时间】:2015-12-22 01:32:26
【问题描述】:

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

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 未知变量?

【问题讨论】:

标签: bash shell environment-variables export


【解决方案1】:

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

【讨论】:

  • 你的最后一段不正确,export 仍然可以在一行中使用多种做作。
  • export 可以,但需要引用$assignment 会破坏它。像foo=1 bar=2 这样的行会产生export "foo=1 bar=2",它将foo 设置为1 bar =2。如果引用了任何值,则编写 export $assignment 将不起作用:assignment='foo="hello world"' 导致尝试定义名为 world" 的环境变量,assignment='foo="hello"' 导致 foo 的值为 "hello",不是hello
  • 使用数组和export "${assignment[@]}" 会起作用,假设您可以将一系列赋值解析为一个数组;这超出了read 的一般能力。
  • 确实,我错过了空间问题。不加引号的变量并使用eval 会更简单,并允许多重赋值的情况。
  • 第二个更可取;第一个假设在export 看到它们之前,分词和路径名扩展不会对xargs 的输出进行任何更改。
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多