Muchas de las respuestas usando eval
yecho
funcionan, pero se rompen en varias cosas, como múltiples líneas, intentar escapar de los metacaracteres de shell, escapes dentro de la plantilla que no están destinados a ser expandidos por bash, etc.
Tuve el mismo problema y escribí esta función de shell, que por lo que puedo decir, maneja todo correctamente. Esto aún eliminará solo las nuevas líneas finales de la plantilla, debido a las reglas de sustitución de comandos de bash, pero nunca he encontrado que eso sea un problema siempre que todo lo demás permanezca intacto.
apply_shell_expansion() {
declare file="$1"
declare data=$(< "$file")
declare delimiter="__apply_shell_expansion_delimiter__"
declare command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter"
eval "$command"
}
Por ejemplo, puede usarlo así con un parameters.cfg
que es realmente un script de shell que solo establece variables, y template.txt
que es una plantilla que usa esas variables:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
En la práctica, lo uso como una especie de sistema de plantilla ligero.
eval
.