我想显示脚本的完成时间。
我目前所做的是——
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
这只是显示脚本的开始和结束时间。是否可以显示细粒度的输出,例如处理器时间/ io 时间等?
答案1
time
只需在调用脚本时使用:
time yourscript.sh
答案2
如果time
不是一个选择,
start=`date +%s`
stuff
end=`date +%s`
runtime=$((end-start))
或者,如果您需要亚秒级精度并已bc
安装,
start=`date +%s.%N`
stuff
end=`date +%s.%N`
runtime=$( echo "$end - $start" | bc -l )
答案3
只需致电times
退出脚本时不带参数。
与ksh
或 一起zsh
,您也可以使用time
它来代替。除了之外zsh
,time
还会为您提供挂钟时间用户和系统CPU 时间。
要保留脚本的退出状态,您可以:
ret=$?; times; exit "$ret"
或者你也可以添加一个陷阱EXIT
:
trap times EXIT
这样,每当 shell 退出时都会调用 times 并保留退出状态。
$ bash -c 'trap times EXIT; : {1..1000000}'
0m0.932s 0m0.028s
0m0.000s 0m0.000s
$ zsh -c 'trap time EXIT; : {1..1000000}'
shell 0.67s user 0.01s system 100% cpu 0.677 total
children 0.00s user 0.00s system 0% cpu 0.677 total
还要注意bash
,ksh
和zsh
都有一个$SECONDS
特殊变量,该变量每秒都会自动增加。在 和 中zsh
,ksh93
该变量也可以设为浮点数(使用typeset -F SECONDS
)以获得更高的精度。这只是挂钟时间,而不是 CPU 时间。
答案4
我有点晚了,但想发布我的解决方案(亚秒级精度),以防其他人碰巧通过搜索偶然发现这个线程。输出的格式为天、小时、分钟,最后是秒:
res1=$(date +%s.%N)
# do stuff in here
res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)
LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
希望有人觉得这很有用!
[编辑] 您需要计算 bash printf 中字段定义中的所有字符,如果您想将秒数填充到点之前的 2 位数字,则必须将其定义为%07.4f
(所有数字和点也计入字段长度),因此该行应如下所示:
LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%07.4f\n" $dd $dh $dm $ds