특정 변수만 envsubst로 대체

특정 변수만 envsubst로 대체

환경변수 교체를 하여 하려고 하는데 envsubst특정 변수만 교체하고 싶습니다.

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

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

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

envsubst쌍에 대한 참조만 대체하려면 어떻게 해야 합니까 ${VAR_1}?

답변1

매뉴얼 페이지에 따르면:

envsubst [OPTION] [SHELL-FORMAT]

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

SHELL-FORMAT 문자열은 어디에 있습니까?$variable" [ ...] 형식의 쉘 변수에 대한 문자열 참조 ${variable}변수 이름은 영숫자 또는 밑줄 ASCII 문자만 포함해야 하며 숫자로 시작할 수 없으며 비어 있지 않습니다. 그렇지 않으면 해당 변수 참조가 무시됩니다.".


이 형식은 지원 ${VAR:-default}되지 않습니다. 나는 언급했다여기이를 지원하는 일부 대안과 기타 기능도 있습니다.


어쨌든, 다음으로 돌아갑니다 gettext envsubst.
따라서 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}

사용자 정의 설정 변수가 실행 중인 셸 환경으로 유출되는 것을 방지하려면 이러한 변수를 내보내는 대신 다음을 수행하세요.일부 껍질, 예를 들어불다접두사 명령 허용변수 할당. 이 방법으로 할당된 값은 명령 실행에만 사용되며 후속 쉘 환경에는 영향을 미치지 않습니다.

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

# ...

VAR1="number 1" VAR3="numero 3" envsubst '${VAR1} ${VAR3}' <infile

# output:
# VAR1=number 1
# VAR2=${VAR2}
# VAR3=numero 3

echo "VAR1=${VAR1}"
echo "VAR2=${VAR2}"
echo "VAR3=${VAR3}"
# output shows that the original environment was preserved:
# VAR1=one
# VAR2=two
# VAR3=three

답변2

docker와 관련되어 있지만 이 유틸리티는 envplate해당 작업을 수행해야 합니다.https://github.com/kreuzwerker/envplate

추가 정보 파일에서:

환경 키를 사용하여 구성 파일을 간단하게 템플릿화합니다. 이러한 키에 대한 참조는 모든 구성 파일에서 다음과 같이 선언될 수 있습니다.

${key} 또는

${키:-기본값}

gnutext의 envsubst는 로만 대체됩니다 ${key}. 누락된 경우 로 대체됩니다 ''.

답변3

불행히도 "내보내기"는 필수입니다. 그렇지 않으면 작동하지 않습니다. 여기에 예가 있습니다.

먼저 파일을 입력합니다. 저는 NGINX_HOST 및 NGINX_PORT만 변경하고 싶고 "$uri"와 같은 입력 파일의 다른 변수는 건드리고 싶지 않습니다.

$ egrep 'server_name|listen|try_files' nginx-default.conf.template 
  server_name ${NGINX_HOST};
  listen ${NGINX_PORT};
    try_files $uri $uri/ /index.php?$args;

이제 빈 변수는 다음과 같습니다.

$ echo ${NGINX_HOST}

$ echo ${NGINX_PORT}

다음 변수에 대한 기본값을 설정하십시오.

$ NGINX_HOST=${NGINX_HOST:-localhost}
$ NGINX_PORT=${NGINX_PORT:-80}
$ echo ${NGINX_HOST}
localhost
$ echo ${NGINX_PORT}
80

envsubst를 사용해 보십시오:

$ envsubst \
    '${NGINX_HOST} ${NGINX_PORT}' \
    < nginx-default.conf.template \
    | egrep 'server_name|listen|try_files' 
    
  server_name ;
  listen ;
  try_files $uri $uri/ /index.php?$args;

보시다시피 작동하지 않습니다. 변수가 제대로 작동하려면 변수를 "내보내야" 합니다. 이것은 두 번째 실행입니다.

$ export NGINX_HOST=${NGINX_HOST:-localhost}
$ export NGINX_PORT=${NGINX_PORT:-80}

$ envsubst   '${NGINX_HOST} ${NGINX_PORT}' <  nginx-default.conf.template | egrep 'server_name|listen|try_files' 

  server_name localhost;
  listen 80;
    try_files $uri $uri/ /index.php?$args;

보시다시피 이제 작동합니다. 그것이 다른 사람들에게 도움이 되기를 바랍니다.

답변4

를 호출하기 전에 수정 사항을 envsubst되돌리려면 작은따옴표 내보내기를 사용해야 합니다 VAR_1. 좋다:

export VAR_1='somevalue'

자세한 내용은 다음을 참조하세요.

복잡한 텍스트 파일에서 쉘 변수를 바꾸는 방법

관련 정보