envsubst 명령이 포함 된 스크립트를 실행하려고하면이 오류가 발생합니다. 온라인에서 보면 이것은 표준 bash 명령 인 것 같아서 작동시키기 위해 무엇을 설치해야할지 모르겠습니다.
답변:
편집 : @cobberboy의 답변이 더 정확합니다. 그를 찬성합니다.
brew install gettext
brew link --force gettext
다음은 내 오래된 대답입니다.
envsubstgettext패키지에 포함되어 있습니다.
따라서 당신은 같은 표준 빌드 도구를 사용하여, 자신에 의해 컴파일 할 수 있습니다 make또는 사용 homebrew.
그러나 gettextMacOS에 설치할 때 별 문제가없는 것 같습니다 . 자세한 내용은 다음 URL을 참조하십시오. MacOS X에 gettext를 설치하는 방법
envsubst에 gettext의 일부 (같은 사제에 의해 설치)이 기본적으로 연결되지이다. 나는 이것이 gettext가 술통 전용 공식이기 때문이라고 생각합니다. homebrew에게 술통을 연결하라고 지시 할 수 있지만 의도하지 않은 부작용이있을 수 있습니다. 덜 방해가되는 접근 방식은 alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'사용자 .profile(또는 동등한 항목) 에 추가하여 별칭을 설정하는 것 입니다. 물론 다른 버전의 gettext가 설치되어있을 수 있습니다. 를 실행하여 배울 수 있습니다 brew info gettext.
/usr/local/opt/gettext/bin/envsubst업그레이드를 남아있는
brew install gettext
brew link --force gettext
이렇게하면 OS X에서 envsubst가 활성화되고 강제로 제대로 연결됩니다. 홈브류를 설치해야합니다.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 심볼릭 링크?
gettext많은 것들을 포함합니다. 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확장됩니다 쉘 변수 참조를 너무 -뿐만 아니라 내장 명령 대체 사용 만드는 것입니다, 보안 문제를.evaleval echo내가 원본을 신뢰할 수 있기 때문에 그것은 동일 하는 .. envsubst < .env.example단지가 될 수 없습니다eval echo < .env.example
이제 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
"$ 라인 주위하지만이 아직 시도하지 않았다
envsubstgettext패키지에 포함되어 있습니다. 직접 컴파일 할 수 있습니다. stackoverflow.com/questions/14940383/…