我有一个tmp.txt
包含要导出的变量的文件,例如:
a=123
b="hello world"
c="one more variable"
如何使用export
命令导出所有这些变量,以便以后子进程可以使用它们?
答案1
set -a
. ./tmp.txt
set +a
set -a
导致从现在开始定义的变量被自动导出。它可以在任何类似 Bourne 的 shell 中使用。.
是命令的标准名称和 Bourne 名称source
,因此我更喜欢它的可移植性(source
来自csh
大多数现代类似 Bourne 的 shell,现在在大多数现代类似 Bourne 的 shell 中都可用,包括bash
(有时行为略有不同))。
在 POSIX shell 中,您还可以使用set -o allexport
更具描述性的替代方式来编写它(set +o allexport
取消设置)。
您可以使用以下方法将其设为函数:
export_from() {
# local is not a standard command but is pretty common. It's needed here
# for this code to be re-entrant (for the case where sourced files to
# call export_from). We still use _export_from_ prefix to namespace
# those variables to reduce the risk of those variables being some of
# those exported by the sourced file.
local _export_from_ret _export_from_restore _export_from_file
_export_from_ret=0
# record current state of the allexport option. Some shells (ksh93/zsh)
# have support for local scope for options, but there's no standard
# equivalent.
case $- in
(*a*) _export_from_restore=;;
(*) _export_from_restore='set +a';;
esac
for _export_from_file do
# using the command prefix removes the "special" attribute of the "."
# command so that it doesn't exit the shell when failing.
command . "$_export_from_file" || _export_from_ret="$?"
done
eval "$_export_from_restore"
return "$_export_from_ret"
}
¹ 在 中bash
,请注意它也会导致所有功能声明 whileallexport
被导出到环境(作为BASH_FUNC_myfunction%%
随后由在该环境中运行的所有 shell 导入的环境变量bash
,即使运行时也是如此sh
)。
答案2
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
答案3
A危险的不需要源代码的单行代码:
export $(xargs <file)
- 它无法处理环境文件中经常使用的注释
- 它无法处理带有空格的值,就像问题示例中那样
- 如果它们匹配的话,它可能会无意中将全局模式扩展到文件中
这有点危险,因为它通过 bash 扩展传递行,但当我知道我有安全的环境文件时,它对我很有用。
答案4
只是补充@Stéphane Chazelas 的出色答案,您还可以在文件中使用set -a
/及其对应项(例如“to_export.bash”),如下所示......set +a
#!/usr/bin/env bash
set -a
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a
...然后像这样导出文件中包含的所有变量...
. ./to_export.bash
... 或者...
source ./to_export.bash
谢谢!