새소식

Programming/bash

[bash] 다중 환경 변수(multiple environment variable)와 함께 프로그램 실행하기

  • -

기록용으로 남깁니다.

 

보통 환경 변수가 필요할 때 VAR1="this_value" python3 aa.py 와 같이 변수=값 을 앞에 써주고 그 뒤에 실행시킬 명령(python3 aa.py)을 써주면서 사용합니다.

 

이런 저런 테스트로 노가다를 하다가 보니 이런 생각이 들었습니다.

 

argument 로 aa.py 가 해석할 명령을 주는데 그거와 별개로 파라미터를 명령 해석 및 실행이 아니라 다른 방식 또는 모드 지정을 하고 싶다는 생각이었습니다.

 

다만, 그렇게 하려면 키워드 옵션 지정해서 처리하거나 argparse 를 써서 설정해야 하는데 귀찮더군요..

그래서 생각해낸 게 환경 변수였습니다. 파이썬에서도 자신의 환경 변수에 접근할 수 있으니(os.environ) 어떻게든 되겠지라는 생각을 했습니다.

 

다만, 라즈베리파이4B 환경에서 텐서플로우를 돌려야 하는 프로젝트에 구현을 하는데 무슨 이유에서인지 libgomp.so.1 오류가 발생하고 있어서 LD_PRELOAD 옵션을 지정하고 실행을 하고 있었습니다. 그래서 환경 변수로 명령을 전달하려면 LD_PRELOAD 를 포함한 2개 이상의 환경 변수를 한 줄에 지정할 수 있어야 했었습니다.

 

이런 저런 삽질과 검색 끝에 방법 한가지를 찾아서 기록으로 남깁니다. 그 외에도 다른 방법들이 제시되어 있었지만 제가 가진 환경에서는 이 방법만 정상 동작했습니다.

 

일단 변수 이름은 각각 _END 와 _METHOD 로 지정했습니다.

그 값은 더미로 각각 "hi" 와 "mixed" 를 지정했습니다.

read -r _END _METHOD < <(echo "hi" "mixed") && python3 aa.py

이제 aa.py 에서 os.environ 에 접근하면 됩니다. 안됩니다...

import os
END=os.environ.get("_END")
METHOD=os.environ.get("_METHOD")

 

※참고로 environ 전체 내용이 궁금해서 출력해봤습니다.

 

위와 같이 read 로 읽은 변수는 그 명령행에만 실행되고 그 다음 명령(; 로 구분)에서는 유효하지 않습니다.

export 로 지정해야 그 이후에도 그 값이 유지됩니다. 다음 명령으로는 _END 가 잘 인식됩니다.

 

이마저도 귀찮으면 다음과 같이 txt 파일에 저장해놓고
cat configs.txt
_END="hi"

_METHOD="mixed"

 

set 명령의 allexport 또는 a 명령을 사용해서 처리할 수도 있습니다.
set -a ; . configs.txt ; set +a

 

또는


set -o allexport
. configs.txt

set+a

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.