使用变量创建命令

时间:2014-12-24 19:15:23

标签: bash makefile

我一直在学习make并且正在努力想出办法。我对这种一般结构有一些规则。

FILE = "myfile.txt"

test :
    YOUR = $(subst my,your,$(FILE));\
    cat $(FILE) $(YOUR)

我希望最终结果是运行命令:

cat myfile.txt yourfile.txt

相反,我得到以下内容......

YOUR = "yourfile.txt";\
    cat "myfile.txt" 
/bin/sh: YOUR: command not found
make: *** [test] Error 1

如果不是使用subst函数,而是在YOUR="yourfile"中执行makefile,一切看起来都不错。任何建议或我错过了一些非常基本的东西?我应该补充一点,我使用制表符而不是空格来启动规则中命令的行。

3 个答案:

答案 0 :(得分:1)

您需要区分make执行的内容和shell执行的内容。您的YOUR =行以选项卡开头,是规则操作的一部分,因此它由shell执行,它无法找到一个程序YOUR来执行某些参数。

将扩展放在规则之外:

YOUR = $(subst my,your,$(FILE))

test:
    cat $(FILE) $(YOUR)

请注意,shell分配在等号周围不需要空格,并使用${}而不是$()来引用Bash中的变量:YOUR=${FILE/my/your}(如果用{{1}编写的话}规则,您需要make代替$$,以便shell看到一个美元符号,而$不会尝试变量扩展,它不会了解)。 shell使用make来执行其中包含的命令,结果通常在变量中捕获:$()

答案 1 :(得分:1)

FILE = "myfile.txt"

test :
    $(eval YOUR = $(subst my,your,$(FILE)))
    cp $(FILE) $(YOUR)

您必须使用食谱中的eval功能(Define make variable at rule execution time

答案 2 :(得分:0)

如果你只需要shell配方中的变量而不是make上下文,那么你就不需要打扰eval(它被提升),而只需要分配给shell变量。

例如:

FILE = "myfile.txt"

test :
    YOUR='$(subst my,your,$(FILE))';\
    cat $(FILE) "$${YOUR}"