将环境设置为文件中的变量来运行程序

将环境设置为文件中的变量来运行程序

我想运行一个仅使用文件中定义的环境变量的程序(在本例中为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'}

相关内容