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.

Andrzej
źródło
2
envsubstjest zawarte w gettextpakiecie. możesz skompilować samodzielnie. patrz stackoverflow.com/questions/14940383/…
ymonad
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

ymonad
źródło
8
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
cobberboy
1
Łączenie /usr/local/Cellar/gettext/0.19.8.1 ... Utworzono 194 dowiązań symbolicznych ... wtf 194 dowiązania symboliczne?
Alexander Mills
235
brew install gettext
brew link --force gettext 

Umożliwi to envsubst w systemie OS X i wymusi prawidłowe połączenie. Wymaga zainstalowania homebrew.

cobberboy
źródło
1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 dowiązania symboliczne?
Alexander Mills
@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:

cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF

Odpowiednik:

envsubst < sample.txt

jest:

eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""

Jest jednak zasadnicza różnica :

  • 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.
mklement0
źródło
Podoba mi się ten pomysł, eval echoponieważ ufam źródłu, ale to nie to samo ... envsubst < .env.examplenie może byćeval echo < .env.example
iRaS
1

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
iRaS
źródło
Wydaje się, że usuwa wszystkie wiodące i końcowe spacje
sudo
jak już powiedziano, jest to obejście, które nie jest kompletne. możesz spróbować dodać "około $ line, ale jeszcze tego nie próbowałem
iRaS
1

Jeś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;
cyberz
źródło