启用histtimeformat环境变量可显示history命令执行时间,临时用export histtimeformat="%y-%m-%d %h:%m:%s ",永久则添加至~/.bashrc;旧命令无时间戳不可回填,新命令才生效。

history 命令默认不显示时间,必须手动启用
银河麒麟终端的 history 默认只输出编号和命令,没有执行时间——这不是 bug,是 Bash 的默认行为。时间信息其实一直存在(只要没清空过历史),只是被隐藏了。启用的关键是设置环境变量 HISTTIMEFORMAT,它控制时间如何格式化并插入到历史记录中。
- 临时生效:在当前终端运行
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S ",之后再执行history就能看到带毫秒精度的时间前缀 - 永久生效:把这行加到
~/.bashrc末尾,然后运行source ~/.bashrc;注意别写成~/.bash_history——那是存储文件,不是配置文件 - 常见坑:
HISTTIMEFORMAT后面建议留一个空格,否则时间与命令会粘连(如2026-03-21 09:53:22ls -l)
已执行过的命令补加时间戳不可逆
如果你之前没设置 HISTTIMEFORMAT,那么那些老命令在 ~/.bash_history 文件里就真的没有时间字段——history 命令读取时也不会“脑补”出来。这不是缓存延迟,是数据本身缺失。
- 验证方式:用
cat ~/.bash_history | head -n 5直接看原始文件,如果开头没有类似#1742541182这样的 Unix 时间戳行,说明这些记录从诞生起就没带时间 - 补充时间仅对新执行的命令有效;旧记录无法回填,强行用脚本重写
.bash_history可能导致格式错乱或history解析失败 - 某些麒麟版本(如 V10 SP1)默认启用了时间戳写入(即每条命令前有一行
#1742541182),但history命令仍需HISTTIMEFORMAT才会解析并显示为可读格式
grep 搜索带时间的历史命令要避开注释行
当 HISTTIMEFORMAT 生效后,history 输出会包含时间,但直接用 history | grep "apt" 可能漏掉结果——因为时间戳行(#1742541182)和命令行是分开的两行,而 grep 默认只匹配单行。
- 稳妥做法:先用
history -w强制把内存历史刷入~/.bash_history,再用grep -B1 "apt" ~/.bash_history查找命令及其前一行的时间戳 - 快捷替代:用
history | awk '/apt/{print $0; getline; print $0}'(但依赖history输出格式稳定,部分麒麟定制 shell 可能不兼容) - 更可靠方案:直接查文件 +
sed,例如sed -n '/apt/{x;/^$/{x;b};x;p;n;};x;/^#/{x;b};x' ~/.bash_history 2>/dev/null(较复杂,日常建议用-B1)
time 命令测单次执行耗时,不是 history 时间功能
有人混淆 time ls 和 history 时间显示——前者是测量某条命令实际运行多久(毫秒级),后者只是记录命令何时被敲下(秒级,系统时间)。两者目的、精度、存储位置完全不同。
-
time输出的是进程真实生命周期,受 I/O、CPU 调度影响;HISTTIMEFORMAT记录的是 shell 读取并加入历史队列的时刻 - 若需长期追踪某命令性能变化,不能依赖
history时间,应结合time+ 日志重定向,例如time ls > /dev/null 2>> ~/cmd_perf.log - 麒麟某些加固版本可能禁用
time内置命令,此时可用/usr/bin/time替代,但要注意参数差异(如-vvs-p)
真正容易被忽略的是:HISTTIMEFORMAT 设置后,新终端窗口不会自动继承——除非你把它写进了 ~/.bashrc 并确保该文件被所有交互式 shell 加载。开一堆终端却只在一个里看到时间,大概率是这里漏了。











