09/12/2021
202112090700 envsubst template
envsubst, le templating du shell
envsubst est une commande que j'ai découvert sur le tard et je le regrette. Le script suivant montre un exemple d'utilisation:
$ cat -n pouet.sh ; echo ; ./pouet.sh | cat -n 1 #!/bin/sh 2 3 set -eu 4 5 set -a 6 FOO=foo 7 BAR=bar 8 set +a 9 BAZ=baz 10 11 echo 'FOO: ${FOO} BAR: $BAR BAZ: ${BAZ}' | envsubst 12 echo 'FOO: ${FOO} BAR: $BAR BAZ: ${BAZ}' | envsubst '$FOO $BAZ' 13 echo "FOO: ${FOO} BAR: $BAR BAZ: ${BAZ}"
1 FOO: foo BAR: bar BAZ: 2 FOO: foo BAR: ${BAR} BAZ: 3 FOO: foo BAR: bar BAZ: baz
On observe:
- que seules les variables exportées sont utilisées par envsubst (set -a)
- qu'il est possible de définir la liste des variables à prendre en compte
- que les syntaxes ${VAR} et $VAR sont supportées
Un moteur de blog
Quelques fichiers suffisent pour générer un site statique:
$ envsubst < top.htm > .fichier.html $ envsubst < fichier.md | markdown2html >> .fichier.html $ envsubst < bottom.htm >> .fichier.html $ mv .fichier.html fichier.html
Le moteur de ce blog utilise une (légère) déclinaison du code ci-dessus.
Des fichiers de configuration
J'apprécie Xen et le fichier de configuration d'une "machine virtuelle" (aka domU) ressemble à
name = "al30" maxvcpus = 1 memory = 1024 kernel = "/xen/vmlinuz-virt" ramdisk = "/xen/initramfs-virt" vif = [ 'bridge=br40' ] # run extra = "root=/dev/xvda3 modules=ext4 console=hvc0" disk = [ 'format=raw, vdev=xvda, access=w, target=/xen/al30.img' ] type = "pvh" # run # install #extra = "modules=modules=loop,squashfs console=hvc0" #disk = [ 'format=raw, vdev=xvdc, access=r, devtype=cdrom, target=/xen/alpine-virt-3.14.3-x86_64.iso', 'format=raw, vdev=xvda, access=w, target=/xen/al30.img' ] #type = "pv" # install
Plutôt que de jouer avec des lignes commentées, je fais un template:
# [${GENERATED_ON}] ${GENERATED_PATH}> ${GENERATED_BY} @${GENERATED_AT} maxvcpus = 1 memory = 1024 kernel = "/xen/vmlinuz-virt" ramdisk = "/xen/initramfs-virt" vif = [ 'bridge=br40' ] name = "${XEN_NAME}" type = "${XEN_TYPE}" extra = "${XEN_EXTRA} console=hvc0" disk = [ ${XEN_DISK} ]
Un script enrobe le tout, génère les variables suivant le mode run/install et se termine par:
... WORKDIR=$(mktemp -d) envsubst < ${tmpl} > ${WORKDIR}/xl.cfg cd ${WORKDIR} ${AS_ROOT} xl create xl.cfg $@
Je l'utilise comme suit:
# mode install avec la console xen (-- -c) $ ./domU -i al30.cfg -- -c # mode normal $ ./domU al30.cfg
où al30.cfg définit le template et le nom du domU.
La documentation
- le SHELL-FORMAT
Commentaires: https://github.com/bsdsx/blog_posts/issues/12