파일에 정의된 환경 변수만 사용하는 프로그램(이 경우 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
스크립트를 실행할 때 내 파일에서 환경을 로드하는 것입니다. 어떻게 해야 하나요?
편집: 내가 할 수 있는 한 가지는 이 env 파일을 cat하는 것이지만 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'}