55 votes

Templating with Linux in a Shell Shell ?

Ce que je veux accomplir, c'est.. :

1.) Avoir un fichier de configuration comme modèle, avec des variables comme $version $path (par exemple apache config)

2.) Avoir un Shell Shell qui "remplit" les variables du modèle et écrit le fichier généré sur le disque.

Est-ce possible avec un Shell Shell. Je vous serais très reconnaissant si vous pouviez me citer quelques commandes/outils qui me permettraient d'accomplir cela ou quelques bons liens.

3voto

David Farrell Points 121

Promotion flagrante à venir

Alors que je recherchais des moteurs de modèles basés sur Shell, je suis tombé sur cet article.

J'aimerais soumettre ma création à l'examen :

Bash-TPL | https://github.com/TekWizely/bash-tpl

Un moteur de modélisation intelligent et léger Shell Shell, écrit en Bash.

Bash-TPL vous permet de baliser des fichiers textuels (fichiers de configuration, yaml, xml, scripts, html, etc) avec des commandes scripts et des remplacements de variables, tout en minimisant l'impact sur la disposition de votre fichier original.

Les modèles sont compilés dans des Shell Shell que vous pouvez invoquer (avec des variables, des arguments, etc.) pour générer des fichiers texte de sortie complets et bien formatés.

Ainsi, dans le contexte de la question du PO, un modèle pourrait ressembler à ceci :

test.tpl

Version: <% $version %>
Path: <% $path %>

Un exemple simple d'exécution du modèle avec quelques données :

$ version="v1.0.0" path="/path/to/the/thing" source <( bash-tpl test.tpl )

Version: v1.0.0
Path: /path/to/the/thing

Cet exemple simple a pour but de montrer comment Bash-TPL peut répondre à la question de l'OP.

Le moteur de modèle lui-même prend en charge de nombreuses autres fonctionnalités.

J'espère que vous l'essaierez si vous êtes à la recherche d'un moteur de template Shell Shell intelligent et facile à utiliser.

2voto

gfelisberto Points 1295

J'ai amélioré la réponse de FooF pour que l'utilisateur n'ait pas à désencoder manuellement les guillemets doubles :

#!/bin/bash
template="$(cat $1)"
template=$(sed 's/\([^\\]\)"/\1\\"/g; s/^"/\\"/g' <<< "$template")
eval "echo \"${template}\""

1voto

Vicente Bolea Points 101

Je suis probablement en retard à cette fête. Cependant, je suis tombé sur le même problème et j'ai opté pour la création de mon propre moteur de template BASH en quelques lignes de code :

Supposons que vous ayez ceci file.template :

# My template
## Author
 - @NAME@ <@EMAIL@>

Et ceci rules fichier :

NAME=LEOPOLDO WINSTON
EMAIL=leothewinston\@leoserver.com

Vous exécutez cette commande :

templater rules < file.template

Vous obtenez ceci :

# My template
## Author
 - LEOPOLDO WINSTON <leothewinston@leoserver.com>

Vous pouvez l'installer de la manière suivante :

 bpkg install vicentebolea/bash-templater

Voici le projet site

1voto

Bryan Bugyi Points 111

J'ai récemment publié un script bash script qui accomplit justement cela en utilisant une syntaxe de template à la Jinja. Il s'appelle biscuit . Voici une démonstration :

cookie demo

1voto

alexchandel Points 107

Pour compléter l'excellente réponse de @FooF (les nouvelles lignes n'ont pas été formatées dans le commentaire), en utilisant un heredoc + des caractères de contrôle, vous pouvez autoriser des caractères arbitraires. et noms de fichiers :

template() {
    # if [ "$#" -eq 0 ] ; then return; fi # or just error
    eval "cat <<$(printf '\x04\x04\x04');
$(cat $1)
"
}

Elle accepte tout caractère non nul, et ne tronque que si 3 ^D sont rencontrés sur leur propre ligne (en réalité jamais). zsh supporte même les terminateurs nuls, donc printf '\x00\x00\x00' fonctionnerait. template fonctionne même pour les noms de fichiers traîtres comme :

for num in `seq 10`; do
    template 'foo "$ .html' # works
done

Attention, les modèles Shell peuvent "développer" des commandes arbitraires, par exemple $(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10)) . Avec une grande puissance

Edit : si vous ne voulez vraiment pas que vos fichiers vous attaquent, vous pouvez simplement sudo -u nobody sh (ou un autre utilisateur sûr) au préalable.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X