.ONESHELL ruhu içinde, .ONESHELL'in zorlu ortamlarında oldukça yakınlaşmak mümkündür:
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
Kullanım örneği şunun gibi bir şey olabilir:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Bu çıktıyı gösterir (pid 27801 varsayılarak):
>
Hello
World\n/27801/
Bu yaklaşım, bazı ekstra işlevlere izin verir:
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
Bu kabuk seçenekleri:
- Her komutu yürütülürken yazdırın
- İlk başarısız komuttan çıkın
- Tanımlanmamış kabuk değişkenlerinin kullanımını bir hata olarak ele alın
Diğer ilginç olasılıklar muhtemelen kendilerini gösterecektir.
export ANNOUNCE_BODY
Değişkeni yalnızca kuralların içinde ayarlar - diğer değişkenleri tanımlamak için $$ ANNOUNCE_BODY'ye başvurmaya izin vermez.