특정 변수 만 envsubst로 교체


53

를 통해 환경 변수 교체를 수행하려고 envsubst하지만 특정 변수 만 바꾸고 싶습니다.

문서에서 envsubst특정 변수 만 바꾸 라고 말할 수는 있지만 그렇게 할 수는 없습니다.

예를 들어 다음이 포함 된 파일이있는 경우 :

VAR_1=${VAR_1}
VAR_2=${VAR_2}

에 대한 envsubst참조 만 대체하도록 어떻게 실행해야 ${VAR_1}합니까?

답변:



130

매뉴얼 페이지 당 :

envsubst [OPTION] [SHELL-FORMAT]

SHELL-FORMAT이 제공되면 SHELL-FORMAT에서 참조되는 환경 변수 만 대체됩니다. 그렇지 않으면 표준 입력에서 발생하는 모든 환경 변수 참조가 대체됩니다.

SHELL 형식 문자열이 어디에 형태 쉘 변수를 참조하여 문자열 " $variable또는 ${variable}[...] 변수 이름이 아닌 숫자로 시작하고 비어 있지 수 전적으로 영숫자의 구성 또는 ASCII 문자를 강조해야하며, 그렇지 않으면 이러한 변수 참조는 무시했습니다. " .
따라서 각 변수 이름을 envsubst쉘 형식 문자열로 전달해야합니다 (물론, 문자 그대로로 전달되도록 이스케이프 / 따옴표로 묶어야합니다 envsubst). 예:

입력 파일 예 infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

그리고 같은 일부 값

export  VAR1="one" VAR2="two" VAR3="three"

그런 다음 실행

envsubst '${VAR1} ${VAR3}' <infile

또는

envsubst '${VAR1},${VAR3}' <infile

또는

envsubst '${VAR1}
${VAR3}' <infile

출력

VAR1=one
VAR2=${VAR2}
VAR3=three

또는 백 슬래시를 선호하는 경우 :

envsubst \$VAR1,\$VAR2 <infile

생산

VAR1=one
VAR2=two
VAR3=${VAR3}

13
이것이 왜 대답이 아닌가?
Qsiris

3
예, 이것이 정답입니다!
Thomas Decaux

3
대체 할 수있는 변수를 제한하는 데 사용할 변수 접두어를 알고있는 경우 :envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott

또는 SUBST_VARS다음 목록이있는 경우 :envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.