Nello spirito di .ONESHELL, è possibile avvicinarsi molto agli ambienti con sfide .ONESHELL:
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 esempio di utilizzo potrebbe essere qualcosa del genere:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Questo mostra l'output (assumendo pid 27801):
>
Hello
World\n/27801/
Questo approccio consente alcune funzionalità extra:
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
Queste opzioni di shell:
- Stampa ogni comando mentre viene eseguito
- Esci al primo comando fallito
- Considera l'uso di variabili di shell non definite come un errore
Probabilmente si suggeriranno altre interessanti possibilità.
export ANNOUNCE_BODY
imposta solo la variabile all'interno delle regole - non consente di fare riferimento a $$ ANNOUNCE_BODY per definire altre variabili.