测命令耗时应区分实时测量与历史查询:实时用 /usr/bin/time -p,历史查执行时刻用 HISTTIMEFORMAT,二者工具和目的不同。

直接用 time 测不准,得看你是想测「刚跑完这条命令花了多久」,还是查「历史里某次执行是什么时候、用了多久」——两者完全不是一回事,工具和方法都不同。
用 /usr/bin/time -p 测当前命令真实耗时
shell 内置的 time 只输出 real/user/sys 三行,且在管道、重定向或含 exec 的脚本里容易失真。真正靠谱的是 GNU 版本:
- 必须写全路径:
/usr/bin/time -p ls -l,否则默认调用的是 shell 内建版本 -
-p输出秒级数值(如real 0.008),方便脚本解析;不加则带单位(real 0m0.008s) - 想看内存、I/O、上下文切换等深度指标,换
/usr/bin/time -v curl -s http://example.com - 避免子 shell 污染计时:别写
time { cmd; },改用/usr/bin/time bash -c 'cmd' - 注意:
real是从命令被 shell 接收开始计时,不是从网络响应或磁盘写入完成算起;若只关心网络部分,得把重定向剥离出来单独测
用 HISTTIMEFORMAT 查历史命令的执行时刻
它只记录「你敲下回车那一刻」的时间戳,不记录执行完成时间,也不记录耗时——所以它不能告诉你某次 ls 跑了多久,只能告诉你它大概几点被敲出来的。
- 临时启用:
export HISTTIMEFORMAT="%F %T "(末尾空格不能少,否则时间与命令粘连) - 永久生效:追加到
~/.bashrc,再运行source ~/.bashrc - 旧命令不会补时间——设置前的历史仍无时间戳;新命令的时间格式严格按当前
HISTTIMEFORMAT值写入~/.bash_history -
history输出的是内存缓冲区内容,~/.bash_history文件只在 shell 退出时才更新;如需立刻落盘,手动执行history -w
为什么有些命令根本不出现在 history 里
不是所有命令都会被记录,常见漏掉原因有三个:
- 命令前加了空格,且
HISTCONTROL包含ignorespace(bash 默认行为),比如echo secret不会进历史 -
HISTSIZE设得太小(如 0 或 10),导致缓冲区被清空或截断 - 命令本身是 shell 内置(如
cd、export),某些 shell 配置下可能不记录
查不到耗时?先确认你在查什么
如果你在 history 输出里搜 grep "ls" 想定位某次具体执行,基本白费——同一条命令反复出现,必须结合时间字段缩小范围。而如果你用 time 测出 real 远大于 user + sys,那说明瓶颈不在 CPU,大概率卡在 I/O、锁、网络或调度上,这时候该换 strace -c 或 perf 继续深挖。


















