envsubst: polecenie nie zostało znalezione w systemie Mac OS X 10.8
92
Kiedy próbuję uruchomić skrypt zawierający polecenie envsubst, pojawia się ten błąd. W Internecie wydaje się, że jest to standardowe polecenie bash, więc nie jestem pewien, co zainstalować, aby działało.
Chcesz to dodać jako odpowiedź, abym mógł to zaakceptować?
Andrew,
Wysłałem to jako odpowiedź.
ymonad
Odpowiedzi:
131
Edycja: odpowiedź @cobberboya jest bardziej poprawna. głosuj na niego.
brew install gettext
brew link --force gettext
Oto moja stara odpowiedź:
envsubstjest zawarte w gettextpakiecie.
Dlatego możesz skompilować go samodzielnie, używając standardowych narzędzi do kompilacji, takich jak makelub używając homebrew.
Jednak wydaje się, że ma mały problem podczas instalacji gettextw systemie MacOS. Szczegółowe informacje można znaleźć pod następującym adresem URL: Jak zainstalować gettext na MacOS X
Chociaż envsubstjest częścią gettext (zainstalowanego przez homebrew), domyślnie nie jest dowiązana. Spodziewam się, że dzieje się tak, ponieważ gettext jest formułą wyłącznie dla beczek. Możesz powiedzieć homebrew, aby połączył beczkę, ale może to mieć niezamierzone skutki uboczne. Mniej inwazyjnym podejściem jest skonfigurowanie aliasu przez dodanie alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'do swojego .profile(lub odpowiednika). Oczywiście możesz mieć zainstalowaną inną wersję programu gettext. Możesz się o tym dowiedzieć biegając brew info gettext.
trkoch
2
@trkoch Prawdopodobnie chcesz alias, /usr/local/opt/gettext/bin/envsubstktóry przetrwa aktualizacje
Christoph Hösler
1
Chociaż jest to akceptowana odpowiedź, przewiń w dół do odpowiedzi @ cobberboy, ponieważ często zdarza się, że musisz wymusić link.
Big Money
Zastanawiałem się, dlaczego nagle otrzymałem więcej głosów pozytywnych. Dziękuję za hojność @ymonad
@AlexanderMills yeah gettextzawiera cholernie dużo rzeczy; sama envsubstinstalacja wydaje się przesada, ale jest to najszybszy i najprostszy sposób.
cobberboy
wygląda na to, że łączą symboliczne każdy plik, a nie tylko folder symboliczny
Alexander Mills,
17
Aby wyjaśnić potencjalne zamieszanie:
envsubstjest zewnętrznym plikiem wykonywalnym i dlatego nie jest częścią Bash ; zewnętrzne pliki wykonywalne są zależne od platformy , zarówno pod względem tego, które z nich są dostępne, jak i ich specyficznego zachowania i określonych opcji, które obsługują (chociaż, miejmy nadzieję, istnieje wspólny podzbiór oparty na specyfikacjach POSIX)
Polecenia wbudowane bezpośrednio bashnazywane są wbudowanymi i tylko na nich można polegać na wszystkich platformach .
Aby sprawdzić, czy dane polecenie jest wbudowane , użyj
type <cmdName>
W omawianym przypadku działanie type envsubstna macOS 10.13 zwraca -bash: type: envsubst: not found, z czego można wywnioskować:
envsubst NIE jest wbudowany
envsubstnie ma w twoim systemie $PATH(i prawdopodobnie nie występuje w twoim systemie)
(Z drugiej strony, uruchomienie tego samego polecenia na przykład w systemie Ubuntu 12.04 powraca envsubst is hashed (/usr/bin/envsubst), co informuje, że narzędzie jest obecne i gdzie się znajduje).
Prowizoryczną alternatywą envsubstjest użycie eval, chociaż ma zastosowanie zwykłe zastrzeżenie: używaj evaltylko w przypadku ciągów, których zawartość kontrolujesz lub którym ufasz:
Załóżmy, że sample.txtplik zawiera tekst z nierozszerzonymi odniesieniami do zmiennych; na przykład:
envsubstrozwija tylko odwołania do zmiennych środowiskowych
natomiast evalwzrośnie powłoki referencje zmienne też - jak również wbudowane podstawienia komend , co czyni korzystanie z evalpomocą koncernu bezpieczeństwa.
envsubst
jest zawarte wgettext
pakiecie. możesz skompilować samodzielnie. patrz stackoverflow.com/questions/14940383/…Odpowiedzi:
Edycja: odpowiedź @cobberboya jest bardziej poprawna. głosuj na niego.
Oto moja stara odpowiedź:
envsubst
jest zawarte wgettext
pakiecie.Dlatego możesz skompilować go samodzielnie, używając standardowych narzędzi do kompilacji, takich jak
make
lub używająchomebrew
.Jednak wydaje się, że ma mały problem podczas instalacji
gettext
w systemie MacOS. Szczegółowe informacje można znaleźć pod następującym adresem URL: Jak zainstalować gettext na MacOS Xźródło
envsubst
jest częścią gettext (zainstalowanego przez homebrew), domyślnie nie jest dowiązana. Spodziewam się, że dzieje się tak, ponieważ gettext jest formułą wyłącznie dla beczek. Możesz powiedzieć homebrew, aby połączył beczkę, ale może to mieć niezamierzone skutki uboczne. Mniej inwazyjnym podejściem jest skonfigurowanie aliasu przez dodaniealias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
do swojego.profile
(lub odpowiednika). Oczywiście możesz mieć zainstalowaną inną wersję programu gettext. Możesz się o tym dowiedzieć biegającbrew info gettext
./usr/local/opt/gettext/bin/envsubst
który przetrwa aktualizacjeUmożliwi to envsubst w systemie OS X i wymusi prawidłowe połączenie. Wymaga zainstalowania homebrew.
źródło
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 dowiązania symboliczne?gettext
zawiera cholernie dużo rzeczy; samaenvsubst
instalacja wydaje się przesada, ale jest to najszybszy i najprostszy sposób.Aby wyjaśnić potencjalne zamieszanie:
envsubst
jest zewnętrznym plikiem wykonywalnym i dlatego nie jest częścią Bash ; zewnętrzne pliki wykonywalne są zależne od platformy , zarówno pod względem tego, które z nich są dostępne, jak i ich specyficznego zachowania i określonych opcji, które obsługują (chociaż, miejmy nadzieję, istnieje wspólny podzbiór oparty na specyfikacjach POSIX)bash
nazywane są wbudowanymi i tylko na nich można polegać na wszystkich platformach .Aby sprawdzić, czy dane polecenie jest wbudowane , użyj
type <cmdName>
W omawianym przypadku działanie
type envsubst
na macOS 10.13 zwraca-bash: type: envsubst: not found
, z czego można wywnioskować:envsubst
NIE jest wbudowanyenvsubst
nie ma w twoim systemie$PATH
(i prawdopodobnie nie występuje w twoim systemie)(Z drugiej strony, uruchomienie tego samego polecenia na przykład w systemie Ubuntu 12.04 powraca
envsubst is hashed (/usr/bin/envsubst)
, co informuje, że narzędzie jest obecne i gdzie się znajduje).Prowizoryczną alternatywą
envsubst
jest użycieeval
, chociaż ma zastosowanie zwykłe zastrzeżenie: używajeval
tylko w przypadku ciągów, których zawartość kontrolujesz lub którym ufasz:Załóżmy, że
sample.txt
plik zawiera tekst z nierozszerzonymi odniesieniami do zmiennych; na przykład:cat > sample.txt <<'EOF' Honey, I'm $USER and I'm $HOME. EOF
Odpowiednik:
jest:
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Jest jednak zasadnicza różnica :
envsubst
rozwija tylko odwołania do zmiennych środowiskowycheval
wzrośnie powłoki referencje zmienne też - jak również wbudowane podstawienia komend , co czyni korzystanie zeval
pomocą koncernu bezpieczeństwa.źródło
eval echo
ponieważ ufam źródłu, ale to nie to samo ...envsubst < .env.example
nie może byćeval echo < .env.example
Używam tego teraz w moim skrypcie bash, który wymaga envsubst:
if ! which envsubst > /dev/null 2>&1; then envsubst() { while read line; do line=$( echo $line | sed 's/"/\\"/g' ) eval echo $line done } fi
możesz go użyć jako polecenia envsubst - oczywiście nie jest to kompletna funkcja lub coś innego:
envsubst <<<'Honey, I am $HOME.' envsubst < input > output 2> corrupt
źródło
"
około $ line, ale jeszcze tego nie próbowałemJeśli nie chcesz zawracać sobie głowy instalacją homebrew i gettext, jeden wiersz wykonywalny Perl zrobi:
#!/usr/bin/perl -p $_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
źródło