我正在尝试编写一个简单的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。
我在这方面做错了什么?
答案 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
没有必要,也没有为你做任何事情。