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.
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.
Odpowiedzi:
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
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.
/usr/local/opt/gettext/bin/envsubstktóry przetrwa aktualizacje
brew install gettext
brew link --force gettext
Umożliwi to envsubst w systemie OS X i wymusi prawidłowe połączenie. Wymaga zainstalowania homebrew.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 dowiązania symboliczne?
gettextzawiera cholernie dużo rzeczy; sama envsubstinstalacja wydaje się przesada, ale jest to najszybszy i najprostszy sposób.
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)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 wbudowanyenvsubstnie 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 środowiskowychevalwzrośnie powłoki referencje zmienne też - jak również wbudowane podstawienia komend , co czyni korzystanie z evalpomocą koncernu bezpieczeństwa.eval echoponieważ ufam źródłu, ale to nie to samo ... envsubst < .env.examplenie 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
"około $ line, ale jeszcze tego nie próbowałem
envsubstjest zawarte wgettextpakiecie. możesz skompilować samodzielnie. patrz stackoverflow.com/questions/14940383/…