Quantcast
Channel: sr's lair
Viewing all articles
Browse latest Browse all 687

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

$
0
0
<p data-ke-size="size16">기록용으로 남깁니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">보통 환경 변수가 필요할 때 VAR1="this_value" python3 aa.py 와 같이 변수=값 을 앞에 써주고 그 뒤에 실행시킬 명령(python3 aa.py)을 써주면서 사용합니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">이런 저런 테스트로 노가다를 하다가 보니 이런 생각이 들었습니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">argument 로 aa.py 가 해석할 명령을 주는데 그거와 별개로 파라미터를 명령 해석 및 실행이 아니라 다른 방식 또는 모드 지정을 하고 싶다는 생각이었습니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">다만, 그렇게 하려면 키워드 옵션 지정해서 처리하거나 argparse 를 써서 설정해야 하는데 귀찮더군요..</p> <p data-ke-size="size16">그래서 생각해낸 게 환경 변수였습니다. 파이썬에서도 자신의 환경 변수에 접근할 수 있으니(os.environ) 어떻게든 되겠지라는 생각을 했습니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">다만, 라즈베리파이4B 환경에서 텐서플로우를 돌려야 하는 프로젝트에 구현을 하는데 무슨 이유에서인지 libgomp.so.1 오류가 발생하고 있어서 LD_PRELOAD 옵션을 지정하고 실행을 하고 있었습니다. 그래서 환경 변수로 명령을 전달하려면 LD_PRELOAD 를 포함한 2개 이상의 환경 변수를 한 줄에 지정할 수 있어야 했었습니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">이런 저런 삽질과 검색 끝에 방법 한가지를 찾아서 기록으로 남깁니다. 그 외에도 다른 방법들이 제시되어 있었지만 제가 가진 환경에서는 이 방법만 정상 동작했습니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">일단 변수 이름은 각각 _END 와 _METHOD 로 지정했습니다.</p> <p data-ke-size="size16">그 값은 더미로 각각 "hi" 와 "mixed" 를 지정했습니다.</p> <pre id="code_1705564133723" class="bash" data-ke-language="bash" data-ke-type="codeblock"><code>read -r _END _METHOD < <(echo "hi" "mixed") && python3 aa.py</code></pre> <p data-ke-size="size16"><s>이제 aa.py 에서 os.environ 에 접근하면 됩니다.</s> 안됩니다...</p> <pre id="code_1705564219115" class="python" data-ke-language="python" data-ke-type="codeblock"><code>import os END=os.environ.get("_END") METHOD=os.environ.get("_METHOD")</code></pre> <p data-ke-size="size16"> </p> <p data-ke-size="size16">※참고로 environ 전체 내용이 궁금해서 출력해봤습니다.</p> <p data-ke-size="size16"> </p> <p><figure class="imageblock alignCenter" data-ke-mobileStyle="widthOrigin" data-origin-width="645" data-origin-height="883"><span data-url="https://blog.kakaocdn.net/dn/cOAxJQ/btsDFYiz538/LspZrnJxnMd3oox8eUIyWK/img.png" data-lightbox="lightbox"><img src="https://blog.kakaocdn.net/dn/cOAxJQ/btsDFYiz538/LspZrnJxnMd3oox8eUIyWK/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOAxJQ%2FbtsDFYiz538%2FLspZrnJxnMd3oox8eUIyWK%2Fimg.png" onerror="this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';" data-origin-width="645" data-origin-height="883"/></span></figure> </p> <p data-ke-size="size16">위와 같이 read 로 읽은 변수는 그 명령행에만 실행되고 그 다음 명령(; 로 구분)에서는 유효하지 않습니다.</p> <p data-ke-size="size16">export 로 지정해야 그 이후에도 그 값이 유지됩니다. 다음 명령으로는 _END 가 잘 인식됩니다.</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">이마저도 귀찮으면 다음과 같이 txt 파일에 저장해놓고<br />cat configs.txt<br />_END="hi"</p> <p data-ke-size="size16">_METHOD="mixed"</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">set 명령의 allexport 또는 a 명령을 사용해서 처리할 수도 있습니다.<br />set -a ; . configs.txt ; set +a</p> <p data-ke-size="size16"> </p> <p data-ke-size="size16">또는</p> <p data-ke-size="size16"><br />set -o allexport<br />. configs.txt</p> <p data-ke-size="size16">set+a</p>

Viewing all articles
Browse latest Browse all 687

Trending Articles