¿Hay una manera fácil de sustituir / evaluar variables de entorno en un archivo? Como digamos que tengo un archivo config.xml
que contiene:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
... etc. Quiero reemplazar $INSTANCE_ID
en el archivo con el valor de la INSTANCE_ID
variable de entorno, $SERVICE_NAME
con el valor de la variable SERVICE_NAME
env. No sabré a priori qué variables de entorno son necesarias (o más bien, no quiero tener que actualizar el script si alguien agrega una nueva variable de entorno al archivo de configuración). ¡Gracias!
shell-script
text-processing
scripting
environment-variables
Robert Fraser
fuente
fuente
Respuestas:
Podrías usar
envsubst
(parte degnu gettext
):reemplazará las variables de entorno en su archivo con su valor correspondiente. Los nombres de las variables deben consistir únicamente en caracteres ASCII alfanuméricos o de subrayado, no comenzar con un dígito y no deben estar vacíos; de lo contrario, se ignora dicha referencia variable.
Para reemplazar solo ciertas variables de entorno, consulte esta pregunta.
fuente
^[[:alpha:]_][[:alnum:]_]*$
en el entorno local POSIX.Esto no es muy bueno pero funciona
Si estuviera en un script de shell, se vería así:
Editar, segunda propuesta:
Editar, no estrictamente relacionado con la pregunta, pero en caso de variables leídas del archivo:
fuente
EOF
, el shell ejecutará las líneas restantes como comandos. Podríamos cambiar el separador a algo más largo o más complicado, pero todavía hay una posibilidad teórica de colisión. Y alguien podría hacer deliberadamente un archivo con el separador para ejecutar comandos."; ls ;"
dentro del archivo yeval
vuelva a ejecutar ese comando :) Este es prácticamente el mismo problema que con los ataques de inyección SQL. Usted tiene que tener mucho cuidado al mezclar datos con el código (y eso es lo que son los comandos shell), a menos que seas muy , muy seguro de que nadie está tratando de hacer nada para estropear su día.`"; ls ;"`
: el formato del comentario se comió los backticks. Pero en realidad ese shoule debe estar`ls`
aquí. El punto es que el contenido del archivo conduce a la ejecución de código arbitrario y no hay nada que pueda hacer al respecto.Si tiene Perl (pero no gettext y
envsubst
) puede hacer el reemplazo simple con un script corto:Supuse que los nombres de las variables solo tendrán letras mayúsculas y guiones bajos, pero el primer patrón debería ser fácil de modificar según sea necesario.
$ENV{...}
hace referencia al entorno que Perl ve.Si desea admitir la
${...}
sintaxis o generar un error en las variables no definidas, necesitará más trabajo. Un equivalente cercano degettext
'senvsubst
sería:Aunque creo que alimentar variables como esa a través del entorno del proceso parece un poco dudoso en general: no se pueden usar variables arbitrarias en los archivos (ya que pueden tener significados especiales), y algunos de los valores podrían tener al menos semi- datos sensibles en ellos.
fuente
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
para sustituir solo las variables que están definidas.¿Puedo sugerir mi propio script para esto?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
fuente
De manera similar a la respuesta de Perl, la sustitución de variables de entorno se puede delegar a la CLI de PHP. La dependencia en PHP puede o no ser aceptable dependiendo de la pila tecnológica en uso.
Puede ir más allá y ponerlo en un script reutilizable, por ejemplo
envsubst
:El uso sería:
fuente