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但我希望能够以某种方式获取它。
鉴于您显示的文件,您应该能够执行以下操作:
(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通过。