Với tinh thần .ONESHELL, bạn có thể tiến khá gần trong các môi trường đầy thử thách .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
Một ví dụ về việc sử dụng sẽ như thế này:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
        $(call oneshell,$(TEST))
Điều đó cho thấy đầu ra (giả sử pid 27801):
>
Hello
World\n/27801/
Cách tiếp cận này cho phép một số chức năng bổ sung:
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
Các tùy chọn shell này sẽ:
- In từng lệnh khi nó được thực thi
- Thoát khỏi lệnh đầu tiên bị lỗi
- Coi việc sử dụng các biến shell không xác định là một lỗi
Các khả năng thú vị khác có thể sẽ tự gợi ý.
               
              
export ANNOUNCE_BODYchỉ đặt biến bên trong các quy tắc - nó không cho phép tham chiếu $$ ANNOUNCE_BODY để xác định các biến khác.