envsubst: Befehl unter Mac OS X 10.8 nicht gefunden

91

Wenn ich versuche, ein Skript auszuführen, das den Befehl envsubst enthält, wird dieser Fehler angezeigt. Wenn ich online schaue, scheint dies ein Standard-Bash-Befehl zu sein, daher bin ich mir nicht sicher, was ich installieren soll, damit es funktioniert.

Andrew
quelle
2
envsubstist im gettextPaket enthalten. Sie können selbst kompilieren. siehe stackoverflow.com/questions/14940383/…
ymonad
Möchten Sie das als Antwort hinzufügen, damit ich es akzeptieren kann?
Andrew
Ich habe es als Antwort gepostet.
Ymonad

Antworten:

128

Bearbeiten: @cobberboys Antwort ist korrekter. stimme ihm zu.

brew install gettext
brew link --force gettext 

Folgendes ist meine alte Antwort:

envsubstist im gettextPaket enthalten.

Daher können Sie es selbst kompilieren, indem Sie Standard-Build-Tools wie makeoder verwenden homebrew.

Bei der Installation gettextunter MacOS scheint es jedoch kaum Probleme zu geben. Weitere Informationen finden Sie in der folgenden URL: So installieren Sie gettext unter MacOS X.

Ymonad
quelle
8
Während envsubstes Teil von gettext ist (wie von Homebrew installiert), ist es standardmäßig nicht verknüpft. Ich gehe davon aus, dass gettext eine reine Fassformel ist. Sie könnten Homebrew anweisen, das Fass zu verbinden, aber dies könnte unbeabsichtigte Nebenwirkungen haben. Ein weniger aufdringlicher Ansatz besteht darin, einen Alias ​​einzurichten alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst', indem Sie ihn zu Ihrem .profile(oder einem gleichwertigen) hinzufügen . Natürlich können Sie auch eine andere Version von gettext installieren. Sie können es durch Laufen lernen brew info gettext.
Trkoch
1
@trkoch Du willst wahrscheinlich einen Alias, /usr/local/opt/gettext/bin/envsubstder Upgrades überlebt
Christoph Hösler
1
Während dies die akzeptierte Antwort ist, scrollen Sie bitte nach unten zu @ cobberboys Antwort, da es wahrscheinlich auch häufig vorkommt, dass Sie den Link erzwingen müssen.
Big Money
Ich fragte mich, warum ich plötzlich mehr Stimmen bekam. Vielen Dank für Ihre Großzügigkeit @ymonad
Cobberboy
1
Verknüpfen von /usr/local/Cellar/gettext/0.19.8.1 ... 194 Symlinks erstellt ... wtf 194 Symlinks?
Alexander Mills
232
brew install gettext
brew link --force gettext 

Dadurch wird envsubst unter OS X aktiviert und die ordnungsgemäße Verknüpfung erzwungen. Es muss Homebrew installiert sein.

Cobberboy
quelle
1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 symlinks?
Alexander Mills
@AlexanderMills yeah gettextenthält eine Menge Sachen; Es scheint ein Overkill zu sein, nur um envsubstinstalliert zu werden, aber es ist der schnellste und einfachste Weg.
Cobberboy
Es scheint, als würden sie jede Datei miteinander verknüpfen, anstatt nur einen Ordner zu verknüpfen
Alexander Mills
17

Um mögliche Verwirrung zu beseitigen:

  • envsubstist eine externe ausführbare Datei und daher nicht Teil von Bash ; Externe ausführbare Dateien sind plattformabhängig , sowohl hinsichtlich der verfügbaren als auch hinsichtlich ihres spezifischen Verhaltens und der von ihnen unterstützten spezifischen Optionen (obwohl es hoffentlich eine gemeinsame Teilmenge gibt, die auf den POSIX-Spezifikationen basiert).
  • Direkt in Befehle gebaut bashwerden als builtins , und nur sie können auf über anwesend sein verlassen alle Plattformen .

Verwenden Sie , um zu testen, ob ein bestimmter Befehl integriert ist

type <cmdName>

Im vorliegenden Fall wird unter type envsubstmacOS 10.13 zurückgegeben -bash: type: envsubst: not found, woraus Sie schließen können:

  • envsubst ist NICHT eingebaut
  • envsubstbefindet sich nicht in Ihrem System $PATH(und ist daher wahrscheinlich nicht in Ihrem System vorhanden)

(Wenn Sie dagegen denselben Befehl auf einem Ubuntu 12.04-System ausführen envsubst is hashed (/usr/bin/envsubst), wird zurückgegeben, dass das Dienstprogramm vorhanden ist und sich dort befindet.)


Eine provisorische Alternative zu envsubstist die Verwendung eval, obwohl die übliche Einschränkung gilt: evalNur für Zeichenfolgen verwenden, deren Inhalt Sie kontrollieren oder denen Sie vertrauen:

Angenommen, eine sample.txtDatei enthält Text mit nicht erweiterten Variablenreferenzen. z.B:

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

Das Äquivalent von:

envsubst < sample.txt

ist:

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

Es gibt jedoch einen entscheidenden Unterschied :

  • envsubsterweitert nur die UmgebungUmgebungsvariablenreferenzen
  • während evalexpandieren Shell Variablenreferenzen zu - sowie eingebettete Befehlsersetzungen , das ist , was die Verwendung von macht evalein Sicherheitsproblem.
mklement0
quelle
Ich mag die Idee, eval echoweil ich der Quelle vertraue, aber es ist nicht dasselbe. envsubst < .env.exampleKann nicht einfach seineval echo < .env.example
iRaS
1

Ich verwende dies jetzt in meinem Bash-Skript, für das envsubst erforderlich ist:

if ! which envsubst > /dev/null 2>&1; then
    envsubst() {
        while read line; do
            line=$( echo $line | sed 's/"/\\"/g' )
            eval echo $line
        done
    }
fi

Sie können es als Befehl envsubst verwenden - natürlich ist die Funktion nicht vollständig oder etwas anderes:

envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
iRaS
quelle
Dies scheint alle führenden und nachfolgenden Leerzeichen zu entfernen
Sudo
Wie gesagt, dies ist eine Problemumgehung, die nicht vollständig ist. Sie könnten versuchen, "um $ line hinzuzufügen , aber ich habe dies noch nicht versucht
iRaS
0

Wenn Sie sich nicht die Mühe machen möchten, Homebrew und gettext zu installieren, reicht ein Einzeiler-Perl aus:

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
cyberz
quelle