壳牌表示不是第一次工作

时间:2016-04-20 18:42:28

标签: makefile

我正在尝试编写一个简单的Makefile,类似于下面的内容:

all:
    mkdir -p /home/developer/data/test/ && \ 
    cp /home/developer/data/sample.txt /home/developer/data/test/ && \
    export FILEPATH=$(dir $(shell find /home/developer/data/test/ -type f -name sample.txt))  && \
    echo $$FILEPATH

当我第一次执行make时,echo为null(即Nothing得到打印)。 但是当我执行相同操作而不删除目录测试时,它将打印正确的echo路径。

但是一旦你再次删除测试目录并确实使echo为null。

我在这方面做错了什么?

1 个答案:

答案 0 :(得分:2)

这是一个时间问题。

您希望配方主体的全部内容在配方执行时执行,但事实并非如此。

配方体内的make构造执行 first 并扩展到配方体中,然后由shell运行。

所以$(dir $(shell ...))在任何shell命令运行之前运行,因此find第一次找不到任何内容。

不要像这样跳进make上下文。如果要在shell上下文中运行shell命令,请执行此操作。

all:
    mkdir -p /home/developer/data/test/ && \ 
    cp /home/developer/data/sample.txt /home/developer/data/test/ && \
    FILEPATH=$$(dirname $$(find /home/developer/data/test/ -type f -name sample.txt)) && \
    echo $$FILEPATH

另请注意,export没有必要,也没有为你做任何事情。