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ź:
envsubst
jest zawarte w gettext
pakiecie.
Dlatego możesz skompilować go samodzielnie, używając standardowych narzędzi do kompilacji, takich jak make
lub używając homebrew
.
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
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 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/envsubst
któ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?
gettext
zawiera cholernie dużo rzeczy; sama envsubst
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życie eval
, chociaż ma zastosowanie zwykłe zastrzeżenie: używaj eval
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:
envsubst < sample.txt
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 z eval
pomocą koncernu bezpieczeństwa.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
"
około $ line, ale jeszcze tego nie próbowałem
envsubst
jest zawarte wgettext
pakiecie. możesz skompilować samodzielnie. patrz stackoverflow.com/questions/14940383/…