> -----Original Message-----
> From: Cook, Malcolm <[email protected]>
> Sent: Wednesday, April 9, 2025 8:14 AM
> To: Dmitry Goncharov <[email protected]>
> Cc: [email protected]
> Subject: RE: using $(shell some sh command) when .SHELL has been
> (temporarily) set to non
>
> Sure, thanks for taking an interest....
>
> The following output demonstrates the issue first with changing the shell to
> `bash` and then changing it to duckdb. Note, the script that produces this
> output has -n in the shebang line, so the recipes are not event being run.
>
> GNU Make 4.4.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2023 Free
> Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
> <https://gnu.org/licenses/gpl.html> This is free software: you are free to
> change and redistribute it. There is NO WARRANTY, to the extent permitted by
> law.
> printf 'a /bin/sh\n'
> printf 'b /bin/bash\n'
> printf 'c /bin/sh\n'
> select 'd /bin/sh'
> Parser Error: syntax error at or near "echo"
> LINE 1: echo $0
> ^
> select 'e '
>
>
> here is the script:
>
> #!/bin/env -S make -n -f
> $(info $(shell ${MAKE} --version))
> sh=$(let SHELL .SHELLFLAGS,/bin/sh -eu -o pipefail -c,$(shell $1))
>
> echoa=$(shell echo $$0)
> echob=$(shell echo $$0)
> echoc=$(call sh,echo $$0)
> echod=$(call sh,echo $$0)
> echoe=$(shell echo $$0)
>
> all=a b c d e
> .PHONY: all ${all}
>
> all:: ${all}
>
> a:
> @printf '$@ $(echoa)\n'
>
> b: SHELL=/bin/bash
> b:
> @printf '$@ $(echob)\n'
>
> c: SHELL=/bin/bash
> c:
> @printf '$@ $(echoc)\n'
>
> d: SHELL=duckdb
> d: .SHELLOPT=-c
> d:
> select '$@ $(echod)\n'
>
> e: SHELL=duckdb
> e:
> select '$@ $(echoe)'
This version is perhaps more succinct in demonstrating the issue. It produces
same results:
#!/bin/env -S make -k -n -f
$(info $(shell ${MAKE} --version))
sh=$(let SHELL .SHELLFLAGS,/bin/sh -eu -o pipefail -c,$(shell $1))
echoa=$(shell echo $$0)
echob=$(shell echo $$0)
echoc=$(call sh,echo $$0)
echod=$(call sh,echo $$0)
echoe=$(shell echo $$0)
all=a b c d e
.PHONY: all ${all}
all:: ${all}
b: SHELL=/bin/bash
a b c:
@printf '$@ $(echo${@})\n'
d e: SHELL=duckdb
d e:
select '$@ $(echo${@})\n'
>
>
> > -----Original Message-----
> > From: Dmitry Goncharov <[email protected]>
> > Sent: Wednesday, April 9, 2025 6:45 AM
> > To: Cook, Malcolm <[email protected]>
> > Cc: [email protected]
> > Subject: Re: using $(shell some sh command) when .SHELL has been
> > (temporarily) set to non
> >
> > On Thu, Apr 3, 2025 at 3:35 PM Cook, Malcolm <[email protected]> wrote:
> > >
> > > I expect GNU make is working as expected, but I could use confirmation
> > > ....
> > >
> > > 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.
> > >
> > > 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?
> > >
> >
> > Can you post the makefile code?
> >
> > regards, Dmitry