我想将所有“env”变量从另一个盒子导入到本地计算机。我已将环境变量复制到本地盒子上的 env_var.txt 中。我已执行以下操作:
for i in `cat env_var.txt`; do export $i; done
但是,这似乎并没有正确设置我的所有环境变量。我已经修改了
do export $i
进入
do echo $i
并且变量似乎显示一切正常。可能是什么原因导致这个问题。或者是否有其他方法来导入所有环境变量?
答案1
TL,DR: 导出
export -p >env_var.sh
并导入
. env_var.sh
env_var.txt
您的代码是否有效取决于变量名称和值中存在的格式以及特殊字符(即在 shell 语法中具有特殊含义的字符)。
`cat env_var.txt`
是不带引号的命令替换。不加引号的变量命令替换会对其应用“split+glob”运算符:首先在变量值中的字符处拆分命令的输出IFS
,然后将每个部分解释为文件名通配符模式并替换每个匹配的模式一些文件通过匹配文件的名称。结果是for
循环迭代的单词列表。
不带引号的命令替换很少是您想要的,在这种情况下它绝对不是您想要的。但是,如果文件的语法是例如以下输出,它确实可以工作env
并且变量的值不包含任何*?\[
或空格。
如果env_var.txt
是 的输出env
,如果根据其实际语法(换行符分隔的赋值)对其进行解析,而不是使用没有意义的解析方法,可以获得更好的结果。如果您想使用 split+glob 运算符(这是最简单的方法),请设置IFS
为仅换行符,并关闭通配符匹配。
set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS
然而,有一个问题在接收方无法解决,即 的输出env
不明确。鉴于以下内容:
foo=bar
hello=world
无法判断是否有两个变量(一个foo
用 value调用bar
,一个hello
用 value调用world
),还是只有一个用foo
value调用
bar
hello=world
要以明确的方式导出环境变量,不使用env
,export
改用。该命令export -p
以可由 shell 解析的方式列出所有环境变量的值。所以在导出方面,运行
export -p >env_var.sh
在导入方面,运行
. env_var.sh
警告:在 bash 中, 的输出export -p
是可解析的,但只能由 bash 解析。要获得在其他 sh 样式 shell 中工作的输出,请设置POSIXLY_CORRECT
为任意值。这对其他 shell 没有有害影响,所以你可以这样做
(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh
设置POSIXLY_CORRECT
为之前的值不会对输出产生影响 - 要么它不在环境中并且运行后也不会出现,要么它在环境中并且它的值不会改变。但这足以强制 bash在 的export
输出中使用可移植语法,export -p
而不是 bash 特定的语法declare
。
请注意,导入环境变量可能会导致执行任意代码,因此请确保仅从您信任的源导入env_var.txt
或导入。罪魁祸首是环境变量,而不是执行代码的env_var.sh
事实:仅导入诸如、、等变量就可能导致代码进一步执行。. env_var.sh
PATH
LD_PRELOAD
ENV