获取bash中的时间
获取bash中的时间
下面是几个bash中有关于时间的几个内容(为了区分,下面的变量我都加了前缀$
符号):
- 特殊变量:
$SECONDS $EPOCHSECONDS $EPOCHREALTIME
- 内置关键字
time
和它的格式描述变量$TIMEFORMAT
bash内置特殊变量SECONDS
bash的内置变量SECONDS
记录了bash进程从启动到现在已经过去了多少秒,它会读取硬件时钟来递增(当然,硬件时钟的时间减了,它也会减)。
SECONDS
变量可以被重新赋值为数值(可以是0 负数 小数),赋值为a后,SECONDS变量的值讲从a开始逐秒增加(如果是小数,则小数部分会被截断)。但不能赋值为空,赋值为空后它就从内置变量变成了一个没有特殊含义的普通变量,即使后来再给它赋值为整数值也不行。
1 | # 该bash进程从启动到现在已经过去了459秒 |
通过$SECONDS
可以用来计算一个命令或一个脚本运行了多长时间(只能精确到秒)。例如:
1 |
|
另外,子bash进程会继承父bash进程的SECONDS
变量。
1 | $ echo $SECONDS;(echo $SECONDS;sleep 2;echo $SECONDS) |
bash内置特殊变量EPOCHSECONDS
为了让你看清楚点,看看小写的epoch seconds
。
和SECONDS
变量类似,只不过EPOCHSECONDS
记录的是从1970-01-01 00:00:00.000
开始到现在已经过去了多少秒。
1 | $ echo $EPOCHSECONDS |
由于EPOCHSECONDS
是获取系统时间得到的,因此无所谓父子bash进程的继承关系。
当然,也可以用EPOCHSECONDS
计算命令或脚本的运行时长。
1 |
|
bash内置特殊变量EPOCHREALTIME
为了让你看清楚点,看看小写的epoch realtime
。
和EPOCHSECONDS
一样,唯一的区别是它保存的是精确到微妙的小数值(浮点数)。
1 | $ echo $EPOCHREALTIME |
用来计算命令或脚本的执行时长:
1 |
|
time和bash内置变量TIMEFORMAT
time
大家用的应该很多,用来统计命令的执行时长。
但注意,使用bash时,有两个time可用,一个是bash内置关键字,一个是外部命令。
1 | # bash内置关键字time |
对于内置关键字time来说,它的默认输出中:
real
表示命令从执行到结束,在现实中逝去的时长,也就是我们人认为的命令真正的执行时长。user
表示命令从执行到结束,在用户空间中花费的时长。sys
表示命令从执行到结束,在内核空间中花费的时长。发起的系统调用次数越多,涉及的系统内核对内存的读写越多,sys时间就会越长
内置关键字还可以直接统计bash语法的组合命令的时长。下面是等价的:
1 | $ time { sleep 1;sleep 1; } |
内置关键字time默认会输出real user sys
三种时长,但可以通过bash内置变量TIMEFORMAT
来指定输出格式。TIMEFORMAT的设置格式如下:
1 | %% |
其中:
p
是时长小数位,最大可指定为3,指定大于3的值则等价于3,且不指定p时,默认为3。指定为0则不包含小数,即只精确到秒。l
是长格式的时长
1 | # 精确到毫秒级别 |