프로그램을 실행하려면 환경을 파일의 변수로 설정하세요.

프로그램을 실행하려면 환경을 파일의 변수로 설정하세요.

파일에 정의된 환경 변수만 사용하는 프로그램(이 경우 Python)을 실행하고 싶습니다 vars.env. 예를 들면 다음과 같습니다.

FOO=bar
X=12

다음은 환경을 인쇄하는 간단한 Python 스크립트입니다.

import os
print os.environ

실행하면 env -i python script.pyos.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$_dashdash-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'}

관련 정보