history 默认不显示时间,需设置 HISTTIMEFORMAT 环境变量;该时间是命令被 shell 接收写入历史缓冲区的时刻,非执行完成时间,且仅对新命令生效,旧记录不回填。
history 默认不显示时间,必须设置 HISTTIMEFORMAT 环境变量才能让每条命令带时间戳——但这个时间是命令被 shell 接收并写入历史缓冲区的时刻,不是执行完成时间。
设置 HISTTIMEFORMAT 让 history 显示时间
这是最直接有效的方式,本质是让 bash 在记录命令前自动拼接时间字符串:
-
export HISTTIMEFORMAT="%F %T "是最常用格式(如2026-05-26 05:57:12),注意末尾必须有空格,否则时间与命令会粘连成2026-05-26 05:57:12ls -l - 临时生效:直接在终端运行
export HISTTIMEFORMAT=...,当前会话立即可用 - 永久生效:加到
~/.bashrc末尾,再运行source ~/.bashrc - 格式符可替换:
%Y-%m-%d %H:%M:%S、%D %T、甚至带用户和 IP:[%F %T] [`whoami`] [$(who -u am i 2>/dev/null | awk '{print $NF}' | sed 's/[()]//g')](需注意 IP 获取可靠性)
为什么刚设置完 history 还看不到时间?
常见误解是“一设就全有”,实际有三个硬限制:
- 只对新执行的命令生效:
history输出的是内存中当前会话的历史缓冲区,之前已执行过的命令不会回填时间戳 -
~/.bash_history文件不实时更新:只有 shell 退出时才把缓冲区写入该文件;若想立刻看到效果,执行history -w强制写入,再tail -n 5 ~/.bash_history查看 - 时间格式不兼容旧记录:如果改过
HISTTIMEFORMAT再重读历史文件,旧行仍按老格式存着,不会自动转换
用 grep 快速筛选某天/某时段的命令
时间一加上,就能脱离翻页,直接文本过滤:
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
- 查今天所有命令:
history | grep "$(date +%F)" - 查 14:30 左右的命令:
history | grep "14:30"(注意匹配整行,编号+时间+命令) - 精确到分钟范围(比如 14:30–14:35):
history > /tmp/hist.log && awk '$2 ~ /^2026-05-26$/ && $3 ~ /^14:3[0-5]:/ {print}' /tmp/hist.log - 注意:
history输出第一列是编号,第二列才是时间;若要稳定处理,先导出为文件再用awk或sed更可靠
哪些命令根本不会进 history?
不是所有输入都会被记录,容易忽略的三种情况:
- 命令前加空格:若
HISTCONTROL包含ignorespace(默认常见),echo secret就不会存 -
HISTSIZE=0或设得太小:导致缓冲区清空或截断,新命令挤掉旧记录 - 非交互式 shell:脚本里调用的
bash -c "cmd"不加载~/.bashrc,HISTTIMEFORMAT不生效;得显式bash -i -c "cmd"或在脚本里export HISTTIMEFORMAT=...
真正容易被忽略的一点是:HISTTIMEFORMAT 记录的是“命令被 shell 解析并准备写入历史”的那一刻,不是命令本身执行完的时间——比如 sleep 30 的时间戳仍是敲下回车的瞬间。
