명령의 stdout을 통해 프로그래밍 방식으로 환경 변수 내보내기

명령의 stdout을 통해 프로그래밍 방식으로 환경 변수 내보내기

좋습니다. 원격 서버(OpenShift 서버)를 미러링하는 일부 로컬 환경 변수를 하드코딩하는 대신 프로그래밍 방식으로 수행하고 싶습니다. 따라서 모든 것을 수동으로 최신 상태로 유지할 필요가 없습니다.

지금은 다음과 같은 내용이 파일에 하드코딩되어 있습니다.

#!/usr/bin/env bash

export OPENSHIFT_MONGODB_DB_USERNAME="admin"
export OPENSHIFT_MONGODB_DB_PASSWORD="xyz"
export OPENSHIFT_MONGODB_DB_HOST="emsa-xyz-2-emsa.cloudapps.nabisco.com"
export OPENSHIFT_MONGODB_DB_PORT=60161

하드코딩 대신 다음 명령을 사용하여 OpenShift에서 "공용" 환경 변수를 검색할 수 있습니다.

rhc env list -a <app-name>

stdout에 다음을 기록합니다.

NODE_ENV=jailbreak
NPM_CONFIG_PRODUCTION=true
OPENSHIFT_MONGODB_DB_HOST=emsa-xyz-2-emsa.cloudapps.nabisco.com
OPENSHIFT_MONGODB_DB_PASSWORD=xyz
OPENSHIFT_MONGODB_DB_PORT=60161
OPENSHIFT_MONGODB_DB_USERNAME=admin

내가 어떻게 표준 출력을 취하고, 그 변수 각각을 내보낼 수 있는지 아는 사람 있나요?

나는 그것이 그렇게 될 것이라고 가정합니다 - 각 줄을 가져온 다음 export그 앞에 놓고 실행하십시오 bash -e "export x". 문제는 아마도 서브 쉘에서 실행되고 현재 쉘에 영향을 미치지 않는다는 것입니다.

이 질문에 대한 기존 답변은 훌륭하므로 잃어버려서는 안 됩니다.

답변1

rhc 명령의 출력을 신뢰하는 경우 소스를 제공할 수 있습니다.

. <(rhc env list -a <app-name>)

이는 생성되는 각 라인을 소싱(실행)합니다 rhc.

작성된 대로 위의 코드는 변수를 정의하지만 내보내지는 않습니다. 이 문제를 해결할 수 있지만 아래 코드가 더 안전하고 내보내기를 수행합니다.

소스 명령인 .은 파일을 인수로 예상합니다. 의 출력을 rhc파일류 객체로 변환하려면 다음을 사용합니다.프로세스 대체: <(...).

보안을 강화하려면 다음을 사용하세요.

while read -r line; do declare -x "$line"; done < <(rhc env list -a <app-name>)

여기서는 <(...)입력 리디렉션과 결합된 프로세스 대체를 사용하여 <루프 while가 의 출력에서 ​​읽습니다 rhc. 첫 번째와 두 번째 사이의 공간은 <필수적입니다.~ 아니다생략하세요.

bash에게 다음을 지시 -x하는 옵션declare내보내다변수.

순서 변경

아래 설명에 따라 rhc명령은 다음을 통해 루프 위의 줄에 배치될 수 있습니다 while.

tmpvar=$(rhc env list -a <app-name>)
while read -r line; do declare -x "$line"; done <<<"$tmpvar"

<<<생성여기 문자열. 이 경우 이는 루프 $tmpvar에 대한 입력으로 제공된다는 의미입니다 while.

관련 정보