如何从文件导出变量?


78

我有一个tmp.txt包含要导出的变量的文件,例如:

a=123
b="hello world"
c="one more variable"

如何使用export命令导出所有这些变量,以便子进程以后使用它们?


1
bash --init-file somefile.blah -c“命令”
Dillian Murphey

SO对于如何在进入目录时如何自动获取.env文件提供了有用的答案cd
Dan Dascalescu

@Neerav请接受其他答案。那是一个更好的解决方案。
coderDude

Answers:


64
source tmp.txt
export a b c
./child ...

从另一个问题来看,您不想对变量名进行硬编码:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

测试一下:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable

2
例如,如果环境文件包含注释,则此方法将无效。(例如,可由systemd的EnvironmentFile重用的文件)
Chris Lamb

3
@ChrisLamb您可以grep用来跳过评论:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee

180
set -a
. ./tmp.txt
set +a

set -a从现在开始定义的变量¹将自动导出。它可以在任何类似Bourne的外壳中使用。.source命令的标准名称和Bourne名称,因此我更喜欢使用它以实现可移植性(source来自,但csh现在可以在大多数现代的Bourne式外壳中使用,bash尽管有时(行为有时会有所不同))。

在POSIX Shell中,您还可以使用set -o allexport一种更具描述性的替代方式来编写它(set +o allexport取消设置)。


¹在中bash,请注意,它还会使在打开时声明的所有函数allexport都导出到环境中(作为BASH_FUNC_myfunction%%环境变量,然后由bash该环境中运行的所有shell 导入,即使以方式运行sh)。


1

做就是了:

while read LINE; do export "$LINE"; done < ./tmp.txt

您检查是否可行?
RalfFriedl

@RalfFriedl这应该工作,为什么不呢?它不是很优雅,用它set -a来进行采购要简单得多,但这确实有效。
terdon

这很脆。它不允许输入文件中的注释,不能正确处理带引号的变量值,并且对多行变量失败。当然,我没有很多多行变量,但是我经常使用注释,并且经常需要对变量值使用引号。
路易

它为我工作。
mchawre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.