envsubst: commande introuvable sur Mac OS X 10.8

92

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.

Andrew
la source
2
envsubstest inclus dans le gettextforfait. vous pouvez compiler vous-même. voir stackoverflow.com/questions/14940383/…
ymonad
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

ymonad
la source
8
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.

Cobberboy
la source
1
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é.
mklement0
la source
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
iRaS
la source
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:

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