ด้วยจิตวิญญาณของ. ONESHELL เป็นไปได้ที่จะเข้าใกล้. 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
ตัวอย่างการใช้งานจะเป็นดังนี้:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
ที่แสดงผลลัพธ์ (สมมติว่า pid 27801):
>
Hello
World\n/27801/
วิธีนี้อนุญาตให้มีฟังก์ชันพิเศษบางอย่าง:
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
ตัวเลือกเชลล์เหล่านี้จะ:
- พิมพ์แต่ละคำสั่งในขณะที่ดำเนินการ
- ออกจากคำสั่งแรกที่ล้มเหลว
- ถือว่าการใช้ตัวแปรเชลล์ที่ไม่ได้กำหนดเป็นข้อผิดพลาด
ความเป็นไปได้ที่น่าสนใจอื่น ๆ น่าจะแนะนำตัวเอง
export ANNOUNCE_BODY
ตั้งค่าตัวแปรภายในกฎเท่านั้น - ไม่อนุญาตให้อ้างอิง $$ ANNOUNCE_BODY เพื่อกำหนดตัวแปรอื่น ๆ