No se necesitan herramientas que no sean /bin/sh
. Dado un archivo de plantilla del formulario
Version: ${version}
Path: ${path}
o incluso con código de shell mixto incluido
Version: ${version}
Path: ${path}
Cost: ${cost}\$
$(i=1; for w in one two three four; do echo Param${i}: ${w}; i=$(expr $i + 1); done)
y un archivo de configuración analizable de shell como
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
es simple expandir esto a
Version: 1.2.3-r42
Path: /some/place/under/the/rainbow/where/files/dance/in/happiness
Cost: 42$
Param1: one
Param2: two
Param3: three
Param4: four
De hecho, dada la ruta al archivo de configuración en la variable de shell config_file
y la ruta al archivo de plantilla template_file
, todo lo que necesita hacer es:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Esto es quizás más bonito que tener un script de shell completo como archivo de plantilla (solución de @ mtinberg).
El programa completo de expansión de plantillas ingenuo:
#!/bin/sh
PROG=$(basename $0)
usage()
{
echo "${PROG} <template-file> [ <config-file> ]"
}
expand()
{
local template="$(cat $1)"
eval "echo \"${template}\""
}
case $# in
1) expand "$1";;
2) . "$2"; expand "$1";;
*) usage; exit 0;;
esac
Esto generará la expansión a la salida estándar; simplemente redirija la salida estándar a un archivo o modifique lo anterior de manera obvia para producir el archivo de salida deseado.
Advertencias: la expansión del archivo de plantilla no funcionaría si el archivo contuviera comillas dobles sin escape ( "
). Por razones de seguridad, probablemente deberíamos incluir algunas comprobaciones de cordura obvias o, mejor aún, realizar una transformación de escape de shell si el archivo de plantilla es generado por una entidad externa.
La forma más fácil de hacer esto simplemente en la CLI de Linux es usar
envsubst
Variables de entorno.Archivo de plantilla de ejemplo
apache.tmpl
:Ejecutar
envsubst
y generar el resultado en un nuevo archivomy_apache_site.conf
:Salida:
fuente
Probablemente debería buscar un sistema de gestión de configuración como Puppet o Chef . Estos pueden hacer fácilmente lo que describió anteriormente y mucho más.
fuente
name
, la cadena<%= name %>
en una plantilla será reemplazada porname
el valor de. La forma en que definename
fuera de la plantilla difiere entre los dos sistemas, obviamente.Si desea plantillas ligeras y reales en lugar de código shell que genera nuevos archivos, las opciones habituales son
sed
&awk
operl
. Aquí hay un enlace: http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/Yo, usaría un lenguaje real como perl, tcl, python, ruby o algo más en esa clase. Algo construido para las secuencias de comandos. Todos tienen buenas y sencillas herramientas de plantillas y toneladas de ejemplos en google.
fuente
Yo uso shtpl para eso. (proyecto privado mío, lo que significa que no se usa mucho. Pero tal vez quieras probarlo de todos modos)
Por ejemplo, si desea generar un / etc / network / interfaces a partir de un archivo csv, puede hacerlo así:
Contenido del archivo CSV (aquí test.csv):
Plantilla (aquí interfaces.tpl):
Mando:
Resultado:
¡Disfrutar!
fuente
Mejoré la respuesta de FooF para que el usuario no necesite eliminar las comillas dobles manualmente:
fuente
Recientemente publiqué un script bash que logra eso usando una sintaxis de plantilla tipo jinja. Se llama cookie . Aquí hay una demostración:
fuente
Probablemente llegue tarde a esta fiesta. Sin embargo, me topé con el mismo problema y opté por crear mi propio motor de plantillas BASH en unas pocas líneas de código:
Digamos que tienes esto
file.template
:Y este
rules
archivo:Ejecutas este comando:
Obtienes esto:
Puedes instalarlo de la siguiente manera:
Este es el sitio del proyecto .
fuente
Para ampliar la excelente respuesta de @ FooF (las nuevas líneas no se formatearon en los comentarios), utilizando caracteres de control heredoc +, puede permitir caracteres arbitrarios y nombres de archivos:
Esto acepta cualquier carácter no nulo, y solo se trunca temprano si
^D
se encuentran 3 bytes en su propia línea (en realidad nunca). zsh incluso admite terminadores nulos, porprintf '\x00\x00\x00'
lo que funcionaría.template
incluso funciona para nombres de archivo traicioneros como:Cuidado con las plantillas de shell pueden "expandir" comandos arbitrarios, por ejemplo
$(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))
. Con gran poder ...Editar: si realmente no quieres que tus archivos te lancen armas nucleares, solo
sudo -u nobody sh
(o algún otro usuario seguro) de antemano.fuente