首页 > 解决方案 > 如何将变量放入 makefile 中的 $(shell) 命令中?

问题描述

❯ 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应该输出onetwo因为它回显了 var 并将其存储在另一个 var 中。但它是一个空白行。我怀疑这是因为它正在寻找一个 env 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

标签: bashmakefilegnu-make

解决方案


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

推荐阅读