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

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


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

评论

bash --init-file somefile.blah -c“ command”

SO有一个有用的答案,当您将CD插入目录时,如何自动获取.env文件。

#1 楼

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


评论


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

–克里斯·兰姆(Chris Lamb)
17年11月12日在22:36

@ChrisLamb,您可以使用grep跳过注释:导出$(grep --regexp ^ [A-Z] tmp.txt | cut -d = -f1)

– gvee
18年7月2日在16:05



#2 楼

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运行也是如此)。

评论


如果变量的值为空,则第二次运行将失败

– jk2K
19年11月25日14:01



设置+ a有什么作用?

–学习者
20 Jun 24'5:11



#3 楼

不需要源代码的危险单行代码:

export $(xargs <file)



它不能处理环境文件中经常使用的注释
它无法使用空格来处理值,例如问题示例中的
,如果它们偶然匹配,可能会无意间将全局模式扩展到文件中

,这有点危险,因为它将行通过bash扩展,但是当我知道我有安全的环境文件时,这对我很有用。

评论


您应该在问题中给出的示例上进行尝试。您会注意到由于外壳在空格上进行拆分而导致获得错误的值。

– Kusalananda♦
19年11月30日在22:05

糟糕,尽管非常强烈,但还是要注意。

–villasv
19年11月30日在22:07

另外,如果您不走运,则一行中可能包含文件名混淆字符,这些字符会拉入文件名。

– Kusalananda♦
19年11月30日在22:11

我想我将直接将答案标记为危险。感谢@Kusalananda的警告

–villasv
19年11月30日在22:20

#4 楼

只需执行:

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


评论


您检查是否可行?

– RalfFriedl
19年7月1日在20:33

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

– terdon♦
19年7月2日在8:15

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

–路易
19年7月24日在15:53

它为我工作。

– mchawre
19年8月7日在5:26