You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU Make统计目标耗时代码报错,请求排查问题原因

问题分析与修复方案

核心问题

你的Makefile代码混淆了Make语法和Shell语法,导致执行错误:

  • 目标下的命令行(recipe)中,每一行默认会被当作独立的Shell命令执行。你写的start_time := $(date +"%S")是Make的变量赋值语法,但它被放在recipe里时,Make会把它当成Shell命令去执行,而Shell中不存在start_time这个可执行程序,因此报错找不到文件。
  • 另外,Make本身没有date内置函数,直接写$(date +"%S")无法正确调用系统的date命令。

修复方案

根据需求,有两种常见的实现方式:

方式1:使用Make变量存储时间

如果要把时间存在Make变量中,需要用$(shell ...)函数调用Shell命令,同时用eval在recipe内完成变量赋值:

date:
	$(eval start_time := $(shell date +"%S"))
	@echo "Start Time: $(start_time) s"
  • $(shell date +"%S"):让Make调用Shell的date命令获取秒数
  • $(eval ...):在recipe内执行Make的变量赋值操作

方式2:纯Shell语法实现

如果不需要把时间存在Make变量里,直接用Shell语法更简单,注意要让变量赋值和echo在同一个Shell进程中执行(用分号或反斜杠连接行):

date:
	@start_time=$(date +"%S"); echo "Start Time: $$start_time s"
  • start_time=$(date +"%S"):Shell的变量赋值语法
  • $$start_time:在Make的recipe里,需要写两个$才能让Shell识别为变量,避免被Make提前解析

完整耗时统计示例

如果要实现目标的完整耗时统计,可以记录开始/结束时间戳并计算差值:

date:
	@start_time=$(date +%s); \
	echo "Start Time: $$start_time"; \
	# 这里替换为目标的实际执行命令,比如 sleep 2; \
	end_time=$(date +%s); \
	echo "End Time: $$end_time"; \
	echo "Elapsed: $$((end_time - start_time)) seconds"
  • 用date +%s获取时间戳(秒数),方便计算时间差
  • 用反斜杠\连接多行,确保所有命令在同一个Shell进程中执行,变量可以共享

内容的提问来源于stack exchange,提问作者Twowolfs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:50:58