Makefile VV = $(shell cat foo.txt)导致找不到VV命令

时间:2012-12-13 09:43:32

标签: file makefile

他,
我想将一个文件的内容(包含相对文件路径)读取到一个变量,并为文件中的每一行添加一个路径前缀。然后将所有这些文件复制到目录中。 像这样:

$(httpd_DIR)/my.tar: $(mypath)/html.txt
    rm -rf web
    mkdir -p web
    VV = $(addprefix $(httpd_DIR)/, $(shell cat $(mypath)/html.txt) )
    cp -R $$VV $(httpd_DIR)/web
    $(TAR) -C $(httpd_DIR) -cvf $(httpd_DIR)/web.tar web


$(mypath)/html.txt文件包含一个相对文件路径列表,如下所示:
DIR1 /的file1.html
DIR2 / file2.html
DIR3 / file3.html

出于某种原因,我得到了以下错误:
/ bin / bash:VV:找不到命令

我不是要尝试执行VV,为什么他会给我这个错误?
请注意,如果我取消注释cp命令,我仍会得到同样的错误...... 我在Linux PC上使用GNU make。

1 个答案:

答案 0 :(得分:2)

这里有几个问题。

VV = $(addprefix $(httpd_DIR)/, $(shell cat $(mypath)/html.txt) )

你还没告诉我们你正在使用什么shell,所以我会假设bash。

如果你想在bash中分配一个变量,你必须要注意空格:VV=foo是合法的并且会按你的意愿行事,但如果你输入VV = foo,shell会解释第一个单词, “VV”,作为命令,并且犹豫不决。如果您键入VV=foo bar,则shell会将foo分配给VV,然后忽略命令bar。您可以改为使用VV="foo bar"

然后你遇到了另一个问题。每个命令都在自己的子shell中运行,因此在一个命令中分配的变量不会存活到下一个:

VV=foo
echo $$VV # this will echo a blank

您必须组合命令,如下所示:

VV=foo ; echo $$VV # this will echo foo

或者这个:

VV=foo ; \
  echo $$VV # this will echo foo

(请注意,在第一行之前只有一个TAB。)

通常,在插入实际命令之前,应该使用您能想到的最简单的命令来测试这些构造。这样可以更容易地捕获这些错误。