파일에서 환경 변수를 교체/평가하는 쉬운 방법이 있습니까?
다음을 포함하는 파일이 있다고 가정해 보겠습니다 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_NAME
SERVICE_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
이 프로그램이 설치되어 있는 것은 아닙니다.