[bash] envsubst : Mac OS X 10.8에서 명령을 찾을 수 없음

envsubst 명령이 포함 된 스크립트를 실행하려고하면이 오류가 발생합니다. 온라인에서 보면 이것은 표준 bash 명령 인 것 같아서 작동시키기 위해 무엇을 설치해야할지 모르겠습니다.



답변

편집 : @cobberboy의 답변이 더 정확합니다. 그를 찬성합니다.

brew install gettext
brew link --force gettext

다음은 내 오래된 대답입니다.

envsubstgettext패키지에 포함되어 있습니다.

따라서 당신은 같은 표준 빌드 도구를 사용하여, 자신에 의해 컴파일 할 수 있습니다 make또는 사용 homebrew.

그러나 gettextMacOS에 설치할 때 별 문제가없는 것 같습니다 . 자세한 내용은 다음 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;


답변