我想在脚本中的某一时刻执行以下操作:
start_time=date
在一个或多个进程运行之后:
end_time=date
然后这样做:
elapsed=$end_time-$start_time
echo "Total of $elapsed seconds elapsed for process"
我该怎么做?
答案1
使用纪元以来的时间轻松识别脚本中的时间跨度
man date
%s seconds since 1970-01-01 00:00:00 UTC
%N nanoseconds (000000000..999999999)
。
start_time="$(date -u +%s)"
sleep 5
end_time="$(date -u +%s)"
elapsed="$(($end_time-$start_time))"
echo "Total of $elapsed seconds elapsed for process"
Total of 5 seconds elapsed for process
Bash 不支持浮点数,因此您需要使用像 bc 这样的外部工具来比较时间,例如1475705058.042270582-1475705053.040524971
start_time="$(date -u +%s.%N)"
sleep 5
end_time="$(date -u +%s.%N)"
elapsed="$(bc <<<"$end_time-$start_time")"
echo "Total of $elapsed seconds elapsed for process"
Total of 5.001884264 seconds elapsed for process
答案2
bash 有一个内置定时器变量
start=$SECONDS
# do stuff
end=$SECONDS
duration=$(( end - start ))
echo "stuff took $duration seconds to complete"
答案3
@jasonwryan 已经建议了,但我会把它作为答案,因为当我想为脚本计时时,它也是我的首选。到时间脚本只需使用:
time myscript
答案4
当你测量可能需要很长时间的东西时,以秒为单位阅读答案是非常烦人的。您确实希望得到正确的答案格式(如hh:mm:ss
),而无需扭曲计算。使用date
自己的功能,如下所示:
# Using differences, and give result in hh:mm:ss
S=0; E=121; TT=$((E-S)); date -u -d "@${TT}" +%T
# 00:02:01
# Using date differences, and give result in hh:mm:ss
S=$(date -u +"%s"); E=$((S+121)); TT=$((E-S)); date -u -d "@${TT}" +%T
# 00:02:01