jot*_*iez 6 linux bash makefile function
我有这个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)
Run Code Online (Sandbox Code Playgroud)
(并且,在脚本结束时:)
printf 'Elapsed time: %s\n' $(timer $t)
Run Code Online (Sandbox Code Playgroud)
计算脚本经过的总时间.此代码在bash(shell)脚本中正常工作.所以,我想把这段代码放在每个规则的makefile中.
如何将此功能放在Makefile中?怎样才能在每条规则中呼唤?
我做了这样的事情:
define TIME
stime=$(1)
etime=$(date '+%s')
dt=$((etime - stime)) \
ds=$((dt % 60)) \
...
endef
Run Code Online (Sandbox Code Playgroud)
并在每个规则中:
rule1: dep1 dep2 dep3
...SOME STUFF
@$(call TIME, starttime)
rule2: depx depD rule1
...SOME STUFF
@$(call TIME, starttime)
Run Code Online (Sandbox Code Playgroud)
但数学运算不起作用.我尝试了很多东西,但我做不了
麻烦的是,在你的bash脚本中,变量t从开始(工作之前)到结束(当它可以从结束时间中减去时)存活下来.在Make配方中,每一行都有自己的shell,因此在早期行中设置的shell变量在稍后的行中将不可用.
您可以将一个配方的所有命令串在一行,这样您就可以t在开头设置并在结尾处使用它,但这非常笨拙.我建议你写t一个文件,rule1_time这样两个调用timer就不需要一个公共变量了.哦,不要试图call在命令中使用:
STIME = date '+%s' > $@_time
ETIME = read st < $@_time ; echo $$((`date '+%s'`-$$st))
all:
$(STIME)
do stuff
$(ETIME)
Run Code Online (Sandbox Code Playgroud)
编辑:
我写了上面的代码作为概念的证明; 我是为了清晰,而不是精益求精.如果我正确理解您的评论,您现在想知道如何将时间分解为小时,分钟和秒,而无需从每个规则调用多个函数.有几种方法可以做到这一点,这可能是最干净的:
ETIME = @read st < $@_time ; st=$$((`date '+%s'`-$$st-68400)) ; echo Elapsed time: `date -d @$$st '+%H:%M:%S'`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |