gpt4 book ai didi

linux - 每条规则的运行时间

转载 作者:IT王子 更新时间:2023-10-29 00:52:03 25 4
gpt4 key购买 nike

我有这个 bash 代码:

(在脚本的开头:)

function timer()
{
if [[ $# -eq 0 ]]; then
echo $(date '+%s')
else
local stime=$1
etime=$(date '+%s')

if [[ -z "$stime" ]]; then stime=$etime; fi

dt=$((etime - stime))
ds=$((dt % 60))
dm=$(((dt / 60) % 60))
dh=$((dt / 3600))
printf '%d:%02d:%02d' $dh $dm $ds
fi
}

t=$(timer)

(并且,在脚本末尾:)

printf 'Elapsed time: %s\n' $(timer $t)

计算脚本运行的总时间。此代码在 bash(shell)脚本中运行良好。因此,我想将此代码放入每个规则的 makefile 中。

如何将此函数放入 Makefile 中?以及如何在每个规则中调用它们?

我做了这样的事情:

define TIME
stime=$(1)
etime=$(date '+%s')
dt=$((etime - stime)) \
ds=$((dt % 60)) \
...
endef

在每个规则中:

rule1: dep1 dep2 dep3
...SOME STUFF
@$(call TIME, starttime)

rule2: depx depD rule1
...SOME STUFF
@$(call TIME, starttime)

但是数学运算不起作用。我尝试了很多东西,但我做不到。

最佳答案

麻烦的是,在你的 bash 脚本中,变量 t 从开始(工作之前)一直存在到结束(当它可以从结束时间中减去时)。在 Make 配方中,每一行都有自己的 shell,因此在前面一行中设置的 shell 变量在后面的行中将不可用。

您可以将一个配方的所有命令串在一行中,这样您就可以在开头设置 t 并在结尾使用它,但这非常笨拙。我建议您将 t 写入文件,也许是 rule1_time,这样对 timer 的两次调用就不需要公共(public)变量。哦,不要尝试在命令中使用 call:

STIME = date '+%s' > $@_time
ETIME = read st < $@_time ; echo $$((`date '+%s'`-$$st))

all:
$(STIME)
do stuff
$(ETIME)

编辑:
我写了上面的代码作为概念证明;我是为了清晰,而不是改进。如果我正确理解您的评论,您现在想知道如何将时间分解为小时、分钟和秒,而不需要从每个规则调用多个函数。有几种方法可以做到这一点,这可能是最干净的:

ETIME = @read st < $@_time ; st=$$((`date '+%s'`-$$st-68400)) ; echo Elapsed time: `date -d @$$st '+%H:%M:%S'`

关于linux - 每条规则的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5939646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com