为什么要花同一时间?

时间:2011-07-06 11:07:54

标签: shell time makefile

我在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

2 个答案:

答案 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