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)'


> -----Original Message-----
> From: Dmitry Goncharov <dgoncha...@users.sf.net>
> Sent: Wednesday, April 9, 2025 6:45 AM
> To: Cook, Malcolm <m...@stowers.org>
> Cc: help-make@gnu.org
> 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 <m...@stowers.org> 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

Reply via email to