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:
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
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.
/usr/local/opt/gettext/bin/envsubstqui 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?
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.
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)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 builtinenvsubstn'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' environnementevalse 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é.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
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
envsubstest inclus dans legettextforfait. vous pouvez compiler vous-même. voir stackoverflow.com/questions/14940383/…