【问题标题】:Makefile VV=$(shell cat foo.txt) causes VV command not foundMakefile VV=$(shell cat foo.txt) 导致找不到 VV 命令
【发布时间】:2012-12-13 22:44:53
【问题描述】:

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

$(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,那么为什么 het 会给我这个错误?
请注意,如果我取消注释 cp 命令,我仍然会收到相同的错误... 我在 linux PC 上使用 GNU make。

【问题讨论】:

    标签: file makefile


    【解决方案1】:

    这里有几个问题。

    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。)

    一般来说,在插入真正的命令之前,您应该使用您能想到的最简单的命令来测试这些结构。这样更容易发现这些错误。

    【讨论】:

    • 很好解释。另一个问题是命令不会创建目标文件。如所写,这些命令更新 web.tar,而不是 my.tar。
    • @Idelic:好点。在我引入自动变量(这是改进这个 makefile 的下一步)之前,我通常不会注意到这样的错误。
    • 他,非常感谢您提供的信息,它真的很有帮助!我还将检查自动变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多