En el espíritu de .ONESHELL, es posible acercarse bastante en entornos desafiados por .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 ejemplo de uso sería algo como esto:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Eso muestra la salida (asumiendo pid 27801):
>
Hello
World\n/27801/
Este enfoque permite algunas funciones adicionales:
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
Estas opciones de shell:
- Imprime cada comando a medida que se ejecuta
- Salir con el primer comando fallido
- Trate el uso de variables de shell no definidas como un error
Es probable que surjan otras posibilidades interesantes.
export ANNOUNCE_BODY
solo establece la variable dentro de las reglas; no permite hacer referencia a $$ ANNOUNCE_BODY para definir otras variables.