envsubst 명령이 포함 된 스크립트를 실행하려고하면이 오류가 발생합니다. 온라인에서 보면 이것은 표준 bash 명령 인 것 같아서 작동시키기 위해 무엇을 설치해야할지 모르겠습니다.
답변
편집 : @cobberboy의 답변이 더 정확합니다. 그를 찬성합니다.
brew install gettext
brew link --force gettext
다음은 내 오래된 대답입니다.
envsubst
gettext
패키지에 포함되어 있습니다.
따라서 당신은 같은 표준 빌드 도구를 사용하여, 자신에 의해 컴파일 할 수 있습니다 make
또는 사용 homebrew
.
그러나 gettext
MacOS에 설치할 때 별 문제가없는 것 같습니다 . 자세한 내용은 다음 URL을 참조하십시오. MacOS X에 gettext를 설치하는 방법
답변
brew install gettext
brew link --force gettext
이렇게하면 OS X에서 envsubst가 활성화되고 강제로 제대로 연결됩니다. 홈브류를 설치해야합니다.
답변
잠재적 인 혼란을 해결하려면 :
envsubst
인 외부 실행함으로써 배시 속하지 ; 외부 실행 파일은 플랫폼에 따라 다르며 사용 가능한 기능과 특정 동작 및 지원하는 특정 옵션에 따라 다릅니다.- 직접 내장 명령
bash
이라고 내장 명령을 , 오직 그들 에 존재하는 의존 할 수 있는 모든 플랫폼 .
에 시험 주어진 명령은 내장 여부 , 사용
type <cmdName>
type envsubst
당장 의 경우 macOS 10.13 에서 실행 -bash: type: envsubst: not found
하면을 반환 하며, 여기서 추론 할 수 있습니다.
envsubst
내장이 아님envsubst
시스템에 없습니다$PATH
(따라서 시스템에 없을 가능성이 높습니다).
(반대로, 예를 들어 Ubuntu 12.04 시스템에서 동일한 명령을 실행하면를 반환 envsubst is hashed (/usr/bin/envsubst)
하여 유틸리티가 있고 위치를 알려줍니다.)
에 대한 임시 대안은를 envsubst
사용 eval
하는 것입니다. 일반적인주의 사항이 적용되지만 eval
콘텐츠를 제어하거나 신뢰하는 문자열에만 사용 하세요.
sample.txt
확장되지 않은 변수 참조가있는 텍스트를 포함 하는 파일을 가정합니다 . 예 :
cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF
다음과 동일 :
envsubst < sample.txt
is :
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
그러나 중요한 차이점 이 있습니다 .
envsubst
환경 변수 참조 만 확장 합니다.- 반면
eval
확장됩니다 쉘 변수 참조를 너무 -뿐만 아니라 내장 명령 대체 사용 만드는 것입니다, 보안 문제를.eval
답변
이제 envsubst가 필요한 bash 스크립트에서 이것을 사용하고 있습니다.
if ! which envsubst > /dev/null 2>&1; then
envsubst() {
while read line; do
line=$( echo $line | sed 's/"/\\"/g' )
eval echo $line
done
}
fi
envsubst 명령으로 사용할 수 있습니다. 물론 기능이 완전하거나 다른 것은 아닙니다.
envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
답변
homebrew와 gettext를 설치하지 않으려면 한 줄의 perl 실행 파일을 사용하면됩니다.
#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;