如何将变量放入 makefile 中的 $(shell) 命令中?
How do I get a variable into a $(shell) command in a makefile?
❯ make --version
GNU Make 3.81
❯ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
如何将变量从 for 循环内部传递给 $(shell)?我可以在 $(shell) 之外访问 var,但我不知道如何将它传递给:
A_LIST:= one two
.PHONY: loop
loop:
@for iii in $(A_LIST) ; do \
echo inside recipe loop with sh command: $$iii ; \
export SAVED_OUTPUT=$(shell echo $$iii) ; \
echo $$SAVED_OUTPUT ; \
done
这是我得到的输出:
inside recipe loop with sh command: one
<blank line here>
inside recipe loop with sh command: two
<blank line here>
循环中的最后一行 echo $$SAVED_OUTPUT
应该输出 one
和 two
因为它正在回显 var 并将其存储在另一个 var 中。但它是一个空行。我怀疑这是因为它正在寻找一个环境变量 $iii
但它不存在 - 那么如何将 iii
的值传递给 shell?
这是我不喜欢的一种糟糕的做法。我不想为了访问这样的变量而编写本地文件:
.PHONY: loop
loop:
@for iii in $(A_LIST) ; do \
echo inside recipe loop with sh command: $$iii ; \
echo $$iii > scratch ; \
export SAVED_OUTPUT=$(shell echo $$(cat scratch)) ; \
echo $$SAVED_OUTPUT ; \
done
for
循环已经由 shell 执行 - 在这种情况下,没有理由将 $(shell ...)
也带入其中。只需使用正常的 $()
shell 命令替换语法(加倍 $
使 make 开心,就像变量名一样):
A_LIST:= one two
.PHONY: loop
loop:
@for iii in $(A_LIST) ; do \
echo "inside recipe loop with sh command: $$iii" ; \
SAVED_OUTPUT="$$(somecommand "$$iii")" ; \
echo "$$SAVED_OUTPUT" ; \
done
❯ make --version
GNU Make 3.81
❯ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
如何将变量从 for 循环内部传递给 $(shell)?我可以在 $(shell) 之外访问 var,但我不知道如何将它传递给:
A_LIST:= one two
.PHONY: loop
loop:
@for iii in $(A_LIST) ; do \
echo inside recipe loop with sh command: $$iii ; \
export SAVED_OUTPUT=$(shell echo $$iii) ; \
echo $$SAVED_OUTPUT ; \
done
这是我得到的输出:
inside recipe loop with sh command: one
<blank line here>
inside recipe loop with sh command: two
<blank line here>
循环中的最后一行 echo $$SAVED_OUTPUT
应该输出 one
和 two
因为它正在回显 var 并将其存储在另一个 var 中。但它是一个空行。我怀疑这是因为它正在寻找一个环境变量 $iii
但它不存在 - 那么如何将 iii
的值传递给 shell?
这是我不喜欢的一种糟糕的做法。我不想为了访问这样的变量而编写本地文件:
.PHONY: loop
loop:
@for iii in $(A_LIST) ; do \
echo inside recipe loop with sh command: $$iii ; \
echo $$iii > scratch ; \
export SAVED_OUTPUT=$(shell echo $$(cat scratch)) ; \
echo $$SAVED_OUTPUT ; \
done
for
循环已经由 shell 执行 - 在这种情况下,没有理由将 $(shell ...)
也带入其中。只需使用正常的 $()
shell 命令替换语法(加倍 $
使 make 开心,就像变量名一样):
A_LIST:= one two
.PHONY: loop
loop:
@for iii in $(A_LIST) ; do \
echo "inside recipe loop with sh command: $$iii" ; \
SAVED_OUTPUT="$$(somecommand "$$iii")" ; \
echo "$$SAVED_OUTPUT" ; \
done