Dalam semangat .ONESHELL, Anda dapat mendekati lingkungan yang menantang .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
Contoh penggunaannya akan seperti ini:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Itu menunjukkan output (dengan asumsi pid 27801):
>
Hello
World\n/27801/
Pendekatan ini memungkinkan beberapa fungsi tambahan:
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
Opsi shell ini akan:
- Cetak setiap perintah saat dijalankan
- Keluar dari perintah pertama yang gagal
- Perlakukan penggunaan variabel shell yang tidak ditentukan sebagai kesalahan
Kemungkinan menarik lainnya kemungkinan besar akan muncul dengan sendirinya.
export ANNOUNCE_BODY
hanya menetapkan variabel di dalam aturan - ini tidak mengizinkan referensi $$ ANNOUNCE_BODY untuk menentukan variabel lain.