Lorsque j'essaie d'exécuter un script contenant la commande envsubst, j'obtiens cette erreur. En regardant en ligne, cela semble être une commande bash standard, donc je ne sais pas quoi installer pour le faire fonctionner.
Voulez-vous ajouter cela comme réponse pour que je puisse l'accepter?
Andrew
Je l'ai posté comme réponse.
ymonad
Réponses:
130
Edit: la réponse de @cobberboy est plus correcte. le voter.
brew install gettext
brew link --force gettext
Voici ma vieille réponse:
envsubstest inclus dans le gettextforfait.
Par conséquent, vous pouvez le compiler vous-même, en utilisant des outils de construction standard tels que makeou en utilisant homebrew.
Cependant, il semble y avoir peu de problème lors de l'installation gettextsous MacOS. Voir l'url suivante pour plus de détails: Comment installer gettext sur MacOS X
Bien qu'il envsubstfasse partie de gettext (tel qu'installé par homebrew), il n'est pas lié par défaut. Je suppose que c'est parce que gettext est une formule uniquement en fût. Vous pourriez dire à homebrew de lier le fût, mais cela pourrait avoir des effets secondaires involontaires. Une approche moins intrusive consiste à configurer un alias en l'ajoutant alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'à votre .profile(ou équivalent). Bien sûr, vous pouvez avoir une autre version de gettext installée. Vous pouvez en savoir plus en exécutant brew info gettext.
trkoch
1
@trkoch Vous voulez probablement alias /usr/local/opt/gettext/bin/envsubstqui survit aux améliorations
Christoph Hösler
1
Bien que ce soit la réponse acceptée, veuillez faire défiler jusqu'à la réponse de @ cobberboy, car il est également courant que vous deviez forcer le lien.
Big Money
Je me suis demandé pourquoi je recevais soudainement plus de votes positifs. Merci pour votre générosité @ymonad
cobberboy
1
Lier /usr/local/Cellar/gettext/0.19.8.1 ... 194 liens symboliques créés ... wtf 194 liens symboliques?
Alexander Mills
233
brew install gettext
brew link --force gettext
Cela activera envsubst sur OS X et le forcera à se lier correctement. Il nécessite l'installation de homebrew.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 liens symboliques?
Alexander Mills
@AlexanderMills ouais gettextcomprend un tas de trucs; il semble exagéré de simplement être envsubstinstallé, mais c'est le moyen le plus rapide et le plus simple.
cobberboy
semble qu'ils lient symboliquement chaque fichier au lieu de simplement lier un dossier
Alexander Mills
17
Pour dissiper toute confusion potentielle:
envsubstest un exécutable externe et ne fait donc pas partie de Bash ; les exécutables externes dépendent de la plate-forme , à la fois en ce qui concerne ceux qui sont disponibles ainsi que leur comportement spécifique et les options spécifiques qu'ils prennent en charge (bien que, espérons-le, il existe un sous-ensemble commun basé sur les spécifications POSIX)
Les commandes directement intégrées bashsont appelées intégrées , et seules elles peuvent être invoquées pour être présentes sur toutes les plates-formes .
Pour tester si une commande donnée est une commande intégrée , utilisez
type <cmdName>
Dans le cas présent, l'exécution type envsubstsous macOS 10.13 renvoie -bash: type: envsubst: not found, à partir de laquelle vous pouvez déduire:
envsubst n'est PAS un builtin
envsubstn'est pas dans votre système $PATH(et donc probablement pas présent sur votre système)
(En revanche, exécuter la même commande sur, par exemple, un système Ubuntu 12.04 retourne envsubst is hashed (/usr/bin/envsubst), ce qui vous indique que l'utilitaire est présent et où il se trouve.)
Une alternative improvisée envsubstest à utiliser eval, bien que la mise en garde habituelle s'applique: utilisez evaluniquement sur les chaînes dont vous contrôlez ou faites confiance:
Supposons un sample.txtfichier contenant du texte avec des références de variables non développées; par exemple:
cat > sample.txt <<'EOF'Honey, I'm $USER
and I'm $HOME.
EOF
L'équivalent de:
envsubst < sample.txt
est:
eval"echo \"$(sed 's/"/\\"/g' sample.txt)\""
Il y a cependant une différence cruciale :
envsubstdéveloppe uniquement les références de variables d' environnement
alors evalse développer shell références variables trop - ainsi que intégrés substitutions de commandes , ce qui est ce qui fait usage d' evalun problème de sécurité.
J'aime l'idée de eval echoparce que je fais confiance à la source mais ce n'est pas la même chose .. envsubst < .env.examplene peut pas être justeeval echo < .env.example
iRaS
1
J'utilise ceci maintenant dans mon script bash qui nécessite 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
vous pouvez l'utiliser comme commande envsubst - bien sûr, ce n'est pas une fonctionnalité complète ou autre chose:
envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
Cela semble supprimer tous les espaces de début et de fin
sudo
comme indiqué, il s'agit d'une solution de contournement qui n'est pas complète. vous pouvez essayer d'ajouter "environ $ line mais je n'ai pas encore essayé ceci
iRaS
0
Si vous ne voulez pas vous soucier d'installer homebrew et gettext, un exécutable perl d'une ligne fera l'affaire:
envsubst
est inclus dans legettext
forfait. vous pouvez compiler vous-même. voir stackoverflow.com/questions/14940383/…Réponses:
Edit: la réponse de @cobberboy est plus correcte. le voter.
Voici ma vieille réponse:
envsubst
est inclus dans legettext
forfait.Par conséquent, vous pouvez le compiler vous-même, en utilisant des outils de construction standard tels que
make
ou en utilisanthomebrew
.Cependant, il semble y avoir peu de problème lors de l'installation
gettext
sous MacOS. Voir l'url suivante pour plus de détails: Comment installer gettext sur MacOS Xla source
envsubst
fasse partie de gettext (tel qu'installé par homebrew), il n'est pas lié par défaut. Je suppose que c'est parce que gettext est une formule uniquement en fût. Vous pourriez dire à homebrew de lier le fût, mais cela pourrait avoir des effets secondaires involontaires. Une approche moins intrusive consiste à configurer un alias en l'ajoutantalias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
à votre.profile
(ou équivalent). Bien sûr, vous pouvez avoir une autre version de gettext installée. Vous pouvez en savoir plus en exécutantbrew info gettext
./usr/local/opt/gettext/bin/envsubst
qui survit aux améliorationsCela activera envsubst sur OS X et le forcera à se lier correctement. Il nécessite l'installation de homebrew.
la source
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 liens symboliques?gettext
comprend un tas de trucs; il semble exagéré de simplement êtreenvsubst
installé, mais c'est le moyen le plus rapide et le plus simple.Pour dissiper toute confusion potentielle:
envsubst
est un exécutable externe et ne fait donc pas partie de Bash ; les exécutables externes dépendent de la plate-forme , à la fois en ce qui concerne ceux qui sont disponibles ainsi que leur comportement spécifique et les options spécifiques qu'ils prennent en charge (bien que, espérons-le, il existe un sous-ensemble commun basé sur les spécifications POSIX)bash
sont appelées intégrées , et seules elles peuvent être invoquées pour être présentes sur toutes les plates-formes .Pour tester si une commande donnée est une commande intégrée , utilisez
Dans le cas présent, l'exécution
type envsubst
sous macOS 10.13 renvoie-bash: type: envsubst: not found
, à partir de laquelle vous pouvez déduire:envsubst
n'est PAS un builtinenvsubst
n'est pas dans votre système$PATH
(et donc probablement pas présent sur votre système)(En revanche, exécuter la même commande sur, par exemple, un système Ubuntu 12.04 retourne
envsubst is hashed (/usr/bin/envsubst)
, ce qui vous indique que l'utilitaire est présent et où il se trouve.)Une alternative improvisée
envsubst
est à utilisereval
, bien que la mise en garde habituelle s'applique: utilisezeval
uniquement sur les chaînes dont vous contrôlez ou faites confiance:Supposons un
sample.txt
fichier contenant du texte avec des références de variables non développées; par exemple:L'équivalent de:
est:
Il y a cependant une différence cruciale :
envsubst
développe uniquement les références de variables d' environnementeval
se développer shell références variables trop - ainsi que intégrés substitutions de commandes , ce qui est ce qui fait usage d'eval
un problème de sécurité.la source
eval echo
parce que je fais confiance à la source mais ce n'est pas la même chose ..envsubst < .env.example
ne peut pas être justeeval echo < .env.example
J'utilise ceci maintenant dans mon script bash qui nécessite envsubst:
vous pouvez l'utiliser comme commande envsubst - bien sûr, ce n'est pas une fonctionnalité complète ou autre chose:
la source
"
environ $ line mais je n'ai pas encore essayé ceciSi vous ne voulez pas vous soucier d'installer homebrew et gettext, un exécutable perl d'une ligne fera l'affaire:
la source