在环境设置为文件中的变量的情况下运行程序

mdk*_*ess 7 bash environment-variables

我想运行一个程序(在本例中为 Python),仅在文件中定义了环境变量,例如vars.env

FOO=bar
X=12
Run Code Online (Sandbox Code Playgroud)

这是一个打印环境的简单 Python 脚本:

import os
print os.environ
Run Code Online (Sandbox Code Playgroud)

如果我运行env -i python script.py, os.environ 是空的。同样,如果我跑

$ env -i FOO=bar X=12 python env.py
Run Code Online (Sandbox Code Playgroud)

我得到

env: {'X': '12', 'FOO': 'bar'}
Run Code Online (Sandbox Code Playgroud)

但是,我想做的是vars.env在运行脚本时从我的文件加载环境。我怎样才能做到这一点?

编辑:我可以做的一件事是 cat 这个 env 文件,就像env -i `cat vars.env` python env.py但我希望能够以某种方式获取它。

mik*_*erv 5

鉴于您显示的文件,您应该能够执行以下操作:

(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,那只是因为您需要先格式化您的环境文件。下面是一个例子:

(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
Run Code Online (Sandbox Code Playgroud)

我起初以为你可以通过 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
Run Code Online (Sandbox Code Playgroud)

尽管如此,如果您更愿意获取它的来源,以下是使用 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
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了$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
Run Code Online (Sandbox Code Playgroud)

只有$PWD通过。