默认情况下history不显示时间,需设置histtimeformat环境变量(如export histtimeformat="%f %t ")并重载配置,此后新执行命令才带时间戳;历史文件中旧命令无时间,且时间记录的是输入时刻而非执行完成时刻。

默认情况下,history 命令不显示时间——它只输出编号和命令本身。要看到每条命令的执行时间,必须手动启用时间戳记录,且该设置只对**后续新执行的命令生效**,不会回填已存在的历史记录。
设置 HISTTIMEFORMAT 让 history 显示时间
这是最直接、最常用的方法,本质是让 shell 在写入历史前自动加上时间前缀。
-
HISTTIMEFORMAT是一个环境变量,值为格式化字符串,比如"%F %T "(输出形如2026-04-21 18:09:03) - 只需在
~/.bashrc末尾添加:export HISTTIMEFORMAT="%F %T " - 运行
source ~/.bashrc生效;之后新执行的命令才会带时间写入历史缓冲区 - 注意末尾空格:没有空格会导致时间与命令粘连,例如
2026-04-21 18:09:03ls -l,加空格才清晰可读
查看已记录的历史时间(含常见陷阱)
启用后,history 命令会显示时间,但有三个关键限制你得知道:
-
history输出的是内存中当前会话的历史缓冲区,不是~/.bash_history文件内容——后者只在 shell 退出时才更新 - 如果刚设置了
HISTTIMEFORMAT,但之前已执行过命令,那些命令仍无时间戳;可用history -w强制把当前缓冲区写入文件,再cat ~/.bash_history查看文件里是否真有时间 -
~/.bash_history中的时间格式严格依赖HISTTIMEFORMAT当前值;若你改过格式再重读文件,旧记录仍按老格式存着,不会自动转换
用 grep 筛选某天/某时段执行的命令
时间一旦带上,就能用文本工具快速过滤,比翻页找高效得多:
- 查今天所有命令:
history | grep "$(date +%F)" - 查某个具体时间点附近(比如 17:30 左右):
history | grep "17:30" - 注意:
history输出行首是编号,时间在第二列,所以grep匹配的是整行;若想精确到秒级范围,建议先导出:history > hist.log,再用awk或sed处理
为什么有些命令没出现在 history 里?
不是所有命令都会被记录,常见原因有三个:
- 命令前加了空格,且
HISTCONTROL包含ignorespace(默认常见)——比如echo secret不会被记录 -
HISTSIZE=0或设得很小,导致历史缓冲区被清空或截断 - 非交互式 shell(如脚本中调用的 bash)默认不加载
~/.bashrc,因此HISTTIMEFORMAT不生效;此时需显式用bash -i -c "your_cmd"或在脚本里 export 变量
真正容易被忽略的一点是:时间戳只属于“命令被 shell 接收并写入历史”的那一刻,不是命令实际执行完成的时间。如果你跑一个耗时很长的 sleep 300,历史里记的是你敲下回车的时刻,不是 5 分钟后它结束的时刻。











