envsubst
입력에 선언된 환경 변수를 대체한다는 것을 알고 있습니다 .
$ echo 'Hello $USER' | envsubst
Hello myusername
envsusbst
내가 원하는 것은 환경 변수가 존재하는 경우 이를 대체 하고 변수 문자열은 그대로 유지하는 방법(또는 다른 명령)입니다 . 내가 얻는 것은 다음과 같습니다.
$ echo 'Hello $USER $UNDEFINED_VARIABLE' | envsubst
Hello myusername
내가 원하는 것은:
$ echo 'Hello $USER $UNDEFINED_VARIABLE' | somecommand
Hello myusername $UNDEFINED_VARIABLE
답변1
$USER$PATH
다음과 같은 매개변수 를 전달하면 envsubst
해당 매개변수에서 참조되는 변수만 확장됩니다.
따라서 한 가지 접근 방식은 현재 정의된 모든 환경 변수를 해당 형식으로 전달하는 것일 수 있습니다. 그리고 zsh
:
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst \$${(kj:$:)parameters[(R)*export*]}
$parameters
변수 이름을 해당 유형에 매핑하는 특수 연관 배열입니다.$parameters[(R)*export*]
연관 배열의 값에 포함된 모든 요소로 확장됩니다export
.k
매개변수 확장 플래그를 사용하세요 .열쇠반환 값 대신j:$:
이러한 요소를 연결$
하고 처음에 하나를 추가하십시오.
다른 쉘의 경우 언제든지 돌아가서 perl
목록을 가져올 수 있습니다.
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"
환경 변수 유출에 주의하세요이름출력에서 ps
.
대신 다음에서 모든 작업을 수행할 수 있습니다 perl
.
perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'
같은게 있으니 주의하세요한정그냥 envsubst
그런거야그것은 다음과 같은 것을 확장하지 않습니다${VAR:-x}
쉘이 확장되지 않는 등 의 $HOME
항목 을 확장합니다 .\$HOME
$$HOME
답변2
를 사용하면 env
현재 정의된 모든 환경 변수를 본 다음 해당 목록을 사용하여 해당 변수만 바꿀 수 있습니다. (맨 페이지는 이에 대해 너무 명확하지 않지만 다음을 참조하십시오.이 답변설명을 위해. )
echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"
(의 출력에는 env
변수 값도 나열되어 있지만 envsubst
선행 값도 보고 싶기 $
때문에 불행히도 그것만으로는 사용할 수 없습니다 cut -d= -f1
. 또한 단일을 사용하여 작업을 완료할 수 있습니다. 이전 개정판을 참조하세요 sed
. 그러나 나는 약간의 성능 향상보다는 cut
명확성을 선호합니다 .)cut