web-dev-qa-db-fra.com

envsubst: commande introuvable sur Mac OS X 10.8

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.

50
Andrew

Edit: la réponse de @cobberboy est plus correcte. le voter.

brew install gettext
brew link --force gettext 

Voici mon ancienne réponse:

envsubst est inclus dans le package gettext.

Par conséquent, vous pouvez le compiler par vous-même, en utilisant des outils de construction standard tels que make ou en utilisant homebrew.

Cependant, il semble avoir peu de problèmes lors de l'installation de gettext dans MacOS. Voir l'url suivante pour plus de détails: Comment installer gettext sur MacOS X

71
ymonad
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.

157
cobberboy

Pour dissiper toute confusion potentielle:

  • envsubst est un exécutable externe et donc ne fait pas partie de Bash ; les exécutables externes dépendent de la plate-forme , à la fois en termes de ceux qui sont disponibles ainsi que de leur comportement spécifique et des options spécifiques qu'ils prennent en charge (cependant, espérons-le, il existe un sous-ensemble commun basé sur les spécifications POSIX)
  • Les commandes directement intégrées dans bash sont appelées intégrées , et seulement elles peut être invoqué pour être présent sur toutes les plateformes .

Pour tester si une commande donnée est une commande intégrée, utilisez

type <cmdName>

Dans le cas présent, l'exécution de type envsubst Sur macOS 10.13 renvoie -bash: type: envsubst: not found, Dont vous pouvez déduire:

  • envsubst n'est PAS une fonction intégrée
  • envsubst n'est pas dans le $PATH de votre système (et donc probablement pas présent sur votre système)

(En revanche, l'exécution de la même commande on, par exemple, un système Ubuntu 12.04 renvoie envsubst is hashed (/usr/bin/envsubst), qui vous indique que l'utilitaire est présent et où il se trouve.)


Une alternative de fortune à envsubst consiste à utiliser eval, bien que la mise en garde habituelle s'applique: n'utilisez eval que sur les chaînes dont vous contrôlez ou approuvez le contenu:

Supposons un fichier sample.txt 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 différence cruciale, cependant:

  • envsubst se développe ( uniquement environnement références de variables
  • alors que eval développera Shell références de variables aussi - ainsi que incorporé substitutions de commandes , ce qui fait que utilisation de eval a problème de sécurité.
13
mklement0

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
2
iRaS