Im Geiste von .ONESHELL ist es möglich, in .ONESHELL-herausfordernden Umgebungen ziemlich nahe zu kommen:
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
Ein Anwendungsbeispiel wäre etwa so:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Das zeigt die Ausgabe (unter der Annahme von PID 27801):
>
Hello
World\n/27801/
Dieser Ansatz bietet einige zusätzliche Funktionen:
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
Diese Shell-Optionen werden:
- Drucken Sie jeden Befehl so aus, wie er ausgeführt wird
- Beenden Sie mit dem ersten fehlgeschlagenen Befehl
- Behandeln Sie die Verwendung undefinierter Shell-Variablen als Fehler
Andere interessante Möglichkeiten werden sich wahrscheinlich bieten.
export ANNOUNCE_BODY
Setzt nur die Variable innerhalb von Regeln - es erlaubt nicht, auf $$ ANNOUNCE_BODY zu verweisen, um andere Variablen zu definieren.