他,
我想将一个文件的内容(包含相对文件路径)读取到一个变量,并为文件中的每一行添加一个路径前缀。然后将所有这些文件复制到目录中。
像这样:
$(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。
答案 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。)
通常,在插入实际命令之前,应该使用您能想到的最简单的命令来测试这些构造。这样可以更容易地捕获这些错误。