我在makefile中运行以下命令: -
@START=$(shell date +%s) && \
echo $${START} &&\
sleep 10s && \
END=$(shell date +%s) && \
echo "$${END} $${START}" &&\
DIFF_SUB=$$(($$END - $$START)) && \
echo IT TOOK $${DIFF_SUB} SECONDS
并输出到以下内容: -
1309950228
1309950228 1309950228
IT TOOK 0 SECONDS
答案 0 :(得分:4)
每个$(shell date +%s)
获得相同结果的原因是每个{I}正在执行并同时替换 - 即make
正在运行命令。
在make
进行替换之后,这是shell看到的命令:
@START=1309950228 && \
echo ${START} &&\
sleep 10s && \
END=1309950228 && \
echo "${END} ${START}" &&\
DIFF_SUB=$(($END - $START)) && \
echo IT TOOK ${DIFF_SUB} SECONDS
如果您希望date
命令运行两次,它们之间有10秒的时差,则需要shell执行命令替换,而不是make
:
@START=$$(date +%s) && \
echo $${START} &&\
sleep 10s && \
END=$$(date +%s) && \
echo "$${END} $${START}" &&\
DIFF_SUB=$$(($$END - $$START)) && \
echo IT TOOK $${DIFF_SUB} SECONDS
请注意双$$
和删除shell
make
命令。
答案 1 :(得分:0)
make
在执行任何规则之前扩展规则体中的所有变量和函数引用。由于您使用$(shell)
来运行date
命令,这实际上意味着对date
的所有调用都会在sleep
之前运行。
请记住,规则的主体是已经使用shell执行,所以通常在该上下文中使用$(shell)
是多余的 - 只需让shell执行它的事情而不是试图让make
去做它的一部分。有关如何执行此操作的示例,请参阅camh的答案。
您可以在此处详细了解make
与shell之间的关系:Shell commands in GNU make。