Cuando intento ejecutar un script que contiene el comando envsubst, aparece este error. Al buscar en línea, este parece ser un comando bash estándar, por lo que no estoy seguro de qué instalar para que funcione.
Cuando intento ejecutar un script que contiene el comando envsubst, aparece este error. Al buscar en línea, este parece ser un comando bash estándar, por lo que no estoy seguro de qué instalar para que funcione.
Respuestas:
Editar: la respuesta de @cobberboy es más correcta. votarlo.
brew install gettext
brew link --force gettext
A continuación está mi vieja respuesta:
envsubst
está incluido en el gettext
paquete.
Por lo tanto, puede compilarlo por su cuenta, utilizando herramientas de compilación estándar como make
o using homebrew
.
Sin embargo, parece tener pocos problemas al instalar gettext
en MacOS. Consulte la siguiente URL para obtener más detalles: Cómo instalar gettext en MacOS X
envsubst
es parte de gettext (instalado por homebrew), no está vinculado de forma predeterminada. Supongo que esto se debe a que gettext es una fórmula de solo barril. Podría decirle a Homebrew que vincule el barril, pero esto podría tener efectos secundarios no deseados. Un enfoque menos intrusivo es configurar un alias agregando alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
a su .profile
(o equivalente). Por supuesto, es posible que tenga instalada otra versión de gettext. Puedes aprenderlo corriendo brew info gettext
.
/usr/local/opt/gettext/bin/envsubst
que sobreviva a las actualizaciones
brew install gettext
brew link --force gettext
Esto habilitará envsubst en OS X y lo obligará a vincularse correctamente. Requiere la instalación de homebrew.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 enlaces simbólicos?
gettext
incluye muchísimas cosas; parece exagerado envsubst
instalarlo, pero es la forma más rápida y sencilla.
Para aclarar posibles confusiones:
envsubst
es un ejecutable externo y, por lo tanto, no forma parte de Bash ; Los ejecutables externos dependen de la plataforma , tanto en términos de cuáles están disponibles como de su comportamiento específico y las opciones específicas que admiten (aunque, con suerte, hay un subconjunto común basado en las especificaciones POSIX)bash
se denominan incorporados , y solo se puede confiar en que estarán presentes en todas las plataformas .Para probar si un comando dado es incorporado , use
type <cmdName>
En el caso que nos ocupa, la ejecución type envsubst
en macOS 10.13 devuelve -bash: type: envsubst: not found
, de la que puede inferir:
envsubst
NO es un incorporadoenvsubst
no está en el de su sistema $PATH
(y, por lo tanto, es probable que no esté presente en su sistema)(Por el contrario, ejecutar el mismo comando en, por ejemplo, un sistema Ubuntu 12.04 regresa envsubst is hashed (/usr/bin/envsubst)
, lo que le indica que la utilidad está presente y dónde se encuentra).
Una alternativa improvisada envsubst
es usar eval
, aunque se aplica la advertencia habitual: use eval
solo en cadenas cuyo contenido controle o en el que confíe:
Suponga un sample.txt
archivo que contiene texto con referencias de variables sin expandir; p.ej:
cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF
El equivalente de:
envsubst < sample.txt
es:
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Sin embargo, existe una diferencia crucial :
envsubst
expande solo las referencias de variables de entornoeval
se expandirá shell referencias a variables demasiado -, así como embebidos sustituciones de mando , que es lo que hace uso de eval
un problema de seguridad.eval echo
porque confío en la fuente, pero no es lo mismo ... envsubst < .env.example
no puede ser simplementeeval echo < .env.example
Estoy usando esto ahora en mi script bash que requiere 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
puede usarlo como el comando envsubst; por supuesto, no es una característica completa o algo más:
envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
"
alrededor de $ line, pero todavía no probé esto
envsubst
está incluido en elgettext
paquete. puede compilar por su cuenta. ver stackoverflow.com/questions/14940383/…