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.
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.
Réponses:
Edit: la réponse de @cobberboy est plus correcte. le voter.
brew install gettext
brew link --force gettext
Voici ma vieille réponse:
envsubst
est inclus dans le gettext
forfait.
Par conséquent, vous pouvez le compiler vous-même, en utilisant des outils de construction standard tels que make
ou en utilisant homebrew
.
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 X
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'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
.
/usr/local/opt/gettext/bin/envsubst
qui survit aux améliorations
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?
gettext
comprend un tas de trucs; il semble exagéré de simplement être envsubst
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
type <cmdName>
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 à utiliser eval
, bien que la mise en garde habituelle s'applique: utilisez eval
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:
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 :
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é.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:
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
"
environ $ line mais je n'ai pas encore essayé ceci
envsubst
est inclus dans legettext
forfait. vous pouvez compiler vous-même. voir stackoverflow.com/questions/14940383/…