Dans l'esprit du .ONESHELL, il est possible de se rapprocher assez près des environnements .ONESHELL contestés:
define _oneshell_newline_
endef
define oneshell
@eval "$$(printf '%s\n' '$(strip \
$(subst $(_oneshell_newline_),\n, \
$(subst \,\/, \
$(subst /,//, \
$(subst ','"'"',$(1))))))' | \
sed -e 's,\\n,\n,g' -e 's,\\/,\\,g' -e 's,//,/,g')"
endef
Un exemple d'utilisation serait quelque chose comme ceci:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Cela montre la sortie (en supposant pid 27801):
>
Hello
World\n/27801/
Cette approche permet certaines fonctionnalités supplémentaires:
define oneshell
@eval "set -eux ; $$(printf '%s\n' '$(strip \
$(subst $(_oneshell_newline_),\n, \
$(subst \,\/, \
$(subst /,//, \
$(subst ','"'"',$(1))))))' | \
sed -e 's,\\n,\n,g' -e 's,\\/,\\,g' -e 's,//,/,g')"
endef
Ces options de shell vont:
- Imprimer chaque commande au fur et à mesure de son exécution
- Quitter à la première commande ayant échoué
- Traitez l'utilisation de variables shell non définies comme une erreur
D'autres possibilités intéressantes se suggéreront probablement.
export ANNOUNCE_BODY
ne définit la variable que dans les règles - cela ne permet pas de référencer $$ ANNOUNCE_BODY pour définir d'autres variables.