
ファイルで定義されている環境変数のみを使用するプログラム(この場合は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
スクリプトを実行するときに私のファイルから環境をロードすることです。どうすればいいですか?
編集:私ができることの1つは、この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
私は最初にシェルを通してこれを行うことができると思いました。しかし、おそらくプログラムを呼び出す前に自分の環境のいくつかを設定したかもしれません。ただし、少なくともパラメータの割り当てが正しいことを証明できます。
(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
ただし、ソースを取得するには、次のようにシェルを使用できます。
(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
これは、およびを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'}