파일의 환경 변수를 실제 값으로 바꾸시겠습니까?

파일의 환경 변수를 실제 값으로 바꾸시겠습니까?

파일에서 환경 변수를 교체/평가하는 쉬운 방법이 있습니까?

다음을 포함하는 파일이 있다고 가정해 보겠습니다 config.xml.

<property>
    <name>instanceId</name>
    <value>$INSTANCE_ID</value>
</property>
<property>
    <name>rootPath</name>
    <value>/services/$SERVICE_NAME</value>
</property>

...등.

$INSTANCE_ID파일의 env var 값을 환경 변수 값으로 바꾸고 싶습니다 .INSTANCE_ID$SERVICE_NAMESERVICE_NAME

어떤 환경 변수가 필요한지 미리 알지 못합니다(또는 누군가가 구성 파일에 새 환경 변수를 추가하는 경우 스크립트를 업데이트하고 싶지 않습니다).

답변1

당신이 사용할 수있는envsubst(부분 gnu gettext):

envsubst < infile

파일의 환경 변수는 해당 값으로 대체됩니다.변수 이름은 영숫자 또는 밑줄 ASCII 문자로만 구성되어야 하며 숫자로 시작할 수 없으며 비워 둘 수 없습니다. 그렇지 않으면 해당 변수 참조가 무시됩니다.

gettext envsubst이 지원 및 추가 기능 ${VAR:-default}에 대한 몇 가지 대안 :
rust선택하다
go선택하다
node.js선택하다


특정 환경 변수만 교체하고,이 질문을 보았습니다.

답변2

좋지는 않지만 작동합니다

( echo "cat <<EOF" ; cat config.xml ; echo EOF ) | sh

쉘 스크립트에 있다면 다음과 같습니다:

#! /bin/sh
cat <<EOF
<property>
    <name>instanceId</name>
    <value>$INSTANCE_ID</value>
</property>
EOF

편집, 두 번째 제안:

eval "echo \"$(cat config.xml)\""

질문과 엄격하게 관련이 없지만 파일에서 변수를 읽는 경우 편집하십시오.

(. .env && eval "echo \"$(cat config.xml)\"")

답변3

Perl이 있는 경우( gettext 및 gettext 는 아님 envsubst) 간단한 대체를 위해 짧은 스크립트를 사용할 수 있습니다.

$ export INSTANCE_ID=foo; export SERVICE_NAME=bar;
$ perl -pe 's/\$([_A-Z]+)/$ENV{$1}/g'  < config.xml
<property>
    <name>instanceId</name>
    <value>foo</value>
</property>
<property>
    <name>rootPath</name>
    <value>/services/bar</value>
</property>

변수 이름에는 대문자와 밑줄만 있다고 가정하지만 첫 번째 패턴은 필요한 경우 쉽게 변경할 수 있습니다. $ENV{...}Perl이 보는 환경에 대한 참조입니다.

구문을 지원하거나 설정되지 않은 변수에 오류를 발생시키려면 ${...}추가 작업이 필요합니다. gettext'에 해당하는 대략적인 내용은 다음과 같습니다 envsubst.

perl -pe 's/\$(\{)?([a-zA-Z_]\w*)(?(1)\})/$ENV{$2}/g'

프로세스 환경을 통해 이러한 변수를 제공하는 것은 일반적으로 약간 불확실해 보입니다. 파일에서 임의의 변수를 사용할 수 없으며(특별한 의미가 있을 수 있으므로) 일부 값에는 최소한 약간 민감한 데이터가 있을 수 있습니다. 그들을.

답변4

Perl 및 PHP 예제를 계속해서 Python oneliner는 다음과 같습니다.

python -c 'import os,sys; sys.stdout.write(os.path.expandvars(sys.stdin.read()))' < in.file > out.file

불행하게도 모든 환경에 envsubst이 프로그램이 설치되어 있는 것은 아닙니다.

관련 정보