tmp.txt
文件,其中包含要导出的变量,例如:a=123
b="hello world"
c="one more variable"
如何使用
export
命令导出所有这些变量,以便以后使用通过子进程?#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
评论
bash --init-file somefile.blah -c“ command”SO有一个有用的答案,当您将CD插入目录时,如何自动获取.env文件。