.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))
यह आउटपुट (पीआईडी 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 को अन्य चर को परिभाषित करने की अनुमति नहीं देता है।