我想运行一个仅使用文件中定义的环境变量的程序(在本例中为Python),例如vars.env
:
FOO=bar
X=12
这是一个打印环境的简单 Python 脚本:
import os
print os.environ
如果我运行env -i python script.py
, os.environ 如预期为空。同样,如果我跑
$ env -i FOO=bar X=12 python env.py
我明白了
env: {'X': '12', 'FOO': 'bar'}
然而,我想做的是vars.env
在运行脚本时从我的文件加载环境。我怎样才能做到这一点?
编辑:我可以做的一件事是 cat 这个 env 文件,env -i `cat vars.env` python env.py
但我更希望能够以某种方式获取它。
答案1
鉴于您显示的文件,您应该能够执行以下操作:
(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)
如果它不起作用,那只是因为您需要先格式化环境文件。这是一个例子:
(set -f ; IFS='
' ; env - $(cat) printenv
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
我一开始以为你可以通过 shell 来完成它 - 但它可能会在调用你的程序之前设置一些自己的环境。但我至少可以证明参数的分配是正确的:
(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore
不过,如果您想获取它的来源,可以按以下方式使用 shell:
(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv
请注意,我删除了这些$IFS
内容 - 这不是必需的 - 但我确实必须具体了解文件中的引号。在这里,我本质上是.dot
在采购stdin
- 读取|pipe
作为输入 - 但您可以使用任何文件。我set -a
在读取输入文件之前使用来设置--allexport
选项。
bash
这是使用's sh
- 它添加$PWD
,$SHLVL
和 的结果$_
。有了dash
它就好一点了。并且dash
也不添加一堆导出,因此您可以-a
在命令行上指定参数:
(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test
只有$PWD
通过。
答案2
您可以通过以下方式完成这一切Python
:
$ cat config.py
env = {
'FOO' : 'bar',
'X' : '12',
}
$ cat test.py
import os
import config
os.environ.clear()
os.environ.update(config.env)
print os.environ
然后:
$ python test.py
{'X': '12', 'FOO': 'bar'}
答案3
另一种方法是将文件读入数组,然后使用该数组作为参数。与使用进程替换相比,优点是它可以处理包含空格的值。例子:
$ cat file
FOO=bar
X=12
var=a b c
$ IFS=$'\n' read -d '' -ra vars < file
$ env -i "${vars[@]}" python env.py
{'var': 'a b c', 'X': '12', 'FOO': 'bar'}