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


92

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


2
envsubstgettext패키지에 포함되어 있습니다. 직접 컴파일 할 수 있습니다. stackoverflow.com/questions/14940383/…
ymonad

내가 수락 할 수 있도록 답변으로 추가 하시겠습니까?
Andrew

나는 그것을 답변으로 게시했습니다.
ymonad

답변:


131

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

brew install gettext
brew link --force gettext 

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

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

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

그러나 gettextMacOS에 설치할 때 별 문제가없는 것 같습니다 . 자세한 내용은 다음 URL을 참조하십시오. MacOS X에 gettext를 설치하는 방법


8
반면 envsubst에 gettext의 일부 (같은 사제에 의해 설치)이 기본적으로 연결되지이다. 나는 이것이 gettext가 술통 전용 공식이기 때문이라고 생각합니다. homebrew에게 술통을 연결하라고 지시 할 수 있지만 의도하지 않은 부작용이있을 수 있습니다. 덜 방해가되는 접근 방식은 alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'사용자 .profile(또는 동등한 항목) 에 추가하여 별칭을 설정하는 것 입니다. 물론 다른 버전의 gettext가 설치되어있을 수 있습니다. 를 실행하여 배울 수 있습니다 brew info gettext.
trkoch 2015.11.10

2
당신은 아마 별칭 원하는 @trkoch /usr/local/opt/gettext/bin/envsubst업그레이드를 남아있는
크리스토프 Hösler에게

1
이것이 허용되는 대답이지만 링크를 강제 해야하는 것이 일반적이므로 @cobberboy의 대답으로 스크롤하십시오.
Big Money

왜 갑자기 더 많은 찬성표가 나오는지 궁금했습니다. 당신의 관대함에 감사는 @ymonad
cobberboy

1
/usr/local/Cellar/gettext/0.19.8.1 연결 중 ... 194 개의 심볼릭 링크가 생성되었습니다 ... wtf 194 개의 심볼릭 링크?
Alexander Mills

235
brew install gettext
brew link --force gettext 

이렇게하면 OS X에서 envsubst가 활성화되고 강제로 제대로 연결됩니다. 홈브류를 설치해야합니다.


1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 심볼릭 링크?
Alexander Mills

@AlexanderMills 네, 엄청나게 gettext많은 것들을 포함합니다. envsubst설치하는 것만으로도 과한 것처럼 보이지만 가장 빠르고 간단한 방법입니다.
cobberboy 19

그들은 모든 파일을 심볼릭 링크 대신 그냥 폴더를 심볼릭 링크하는 것처럼 보인다
알렉산더 밀스

17

잠재적 인 혼란을 해결하려면 :

  • 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

의 생각처럼 나는 eval echo내가 원본을 신뢰할 수 있기 때문에 그것은 동일 하는 .. envsubst < .env.example단지가 될 수 없습니다eval echo < .env.example
IRAS

1

이제 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

이 모든 선행 및 후행 공백을 제거하는 것
sudo를

말했듯이 이것은 기능이 완전하지 않은 해결 방법입니다. 당신은 추가 시도 할 수 "$ 라인 주위하지만이 아직 시도하지 않았다
IRAS

1

homebrew와 gettext를 설치하지 않으려면 한 줄의 perl 실행 파일을 사용하면됩니다.

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.