On Thu, Apr 3, 2025 at 3:35 PM Cook, Malcolm <m...@stowers.org> wrote: > I was surprised when setting SHELL (e.g. to `duckdb`) to find that a simply > expanded variable that expands to $(shell some sh command) wound up passing > 'my sh command' to duckdb rather than /bin/sh since It was expanded as part > of a recipe that sets SHELL as a target specific variable for that recipe.
$(shell ...) passes the value of $(.SHELLFLAGS), followed by the recipe to the value of $(SHELL). In certain situations, make passes the value of $(SHELL) followed by the value of $(.SHELLFLAGS), followed by the recipe to /bin/sh -c. E.g. if $(.SHELLFLAGS) contains characters special to shell (such as $ [ ] = ' " ;), then make uses /bin/sh -c. regards, Dmitry > > Should this behavior be considered "by design"? > > My workaround was to instead use $(call sh,some sh command), where sh is > defined as: > > sh=$(let SHELL .SHELLFLAGS,/bin/sh -eu -o pipefail -c,$(shell $1)) > > Is there perhaps a better workaround? > >