linux history 默认不显示时间戳且不跨终端同步;需设histtimeformat="%f %t "显示时间,用prompt_command="history -a; history -n"实现实时同步,并通过histcontrol去重。

Linux 的 history 命令本身不保存时间戳,也不跨会话自动同步全部记录——这是绝大多数人第一次踩坑的地方。默认只在当前 shell 会话中缓存、退出时写入一次 ~/.bash_history,且多个终端并行时彼此看不到对方刚输的命令。
让 history 显示执行时间(HISTTIMEFORMAT)
默认 history 输出只有编号和命令,没有时间。Bash 其实早把时间存进 ~/.bash_history 了,只是不显示。
- 临时启用:运行
export HISTTIMEFORMAT="%F %T ",再执行history就能看到类似123 2026-04-11 19:30:22 ls -la的输出 - 永久生效:把这行加到
~/.bashrc末尾,然后source ~/.bashrc - 注意空格:
HISTTIMEFORMAT值末尾必须带空格,否则时间戳和命令会粘连(如2026-04-1119:30:22ls) - 格式符别写错:
%F是%Y-%m-%d,%T是%H:%M:%S;%D是%m/%d/%y,容易和%F混
多终端历史命令实时同步(history -a + history -n)
开两个终端 A 和 B,你在 A 里执行了 git pull,切到 B 里直接 history 看不到它——因为 B 的内存缓冲区没读新内容。
- 每次执行完命令后,立刻写入文件:
history -a(追加到~/.bash_history) - 每次打开新 prompt 前,从文件加载新增记录:
history -n - 把这两句加进
~/.bashrc的PROMPT_COMMAND里,就能自动同步:PROMPT_COMMAND="history -a; history -n" - 不要用
history -r替代-n:-r会清空当前缓冲区再重载,导致刚输的命令消失
避免重复命令污染 history(HISTCONTROL)
连续敲三次 ls,history 里就占三行,搜索时干扰视线。
-
ignoredups:只忽略**连续重复**的命令(适合防手抖连按回车) -
erasedups:整个历史里同一条命令只留最后一次(更干净,但会删掉早期同名命令) -
ignorespace:以空格开头的命令不记入 history(比如git push,前面加空格可避免敏感操作留痕) - 组合使用:
export HISTCONTROL=ignoredups:erasedups:ignorespace - 注意顺序:
erasedups必须在ignoredups后面,否则可能失效
安全清理与精确删除(history -d / -c)
history -c 是最危险的选项——它只清当前会话内存,~/.bash_history 文件里的记录还在,下次登录又全回来了。
- 删单条:先
history找编号,再history -d 123(删第 123 条) - 删范围:用循环,例如删最近 5 条:
for i in {1..5}; do history -d $(history 1 | awk '{print $1}'); done - 彻底清除:先
history -c清内存,再history -w把空缓冲区写回文件,最后> ~/.bash_history清空文件 - 敏感命令不留痕:设
HISTCONTROL=ignorespace,以后输密码类命令前手动加空格,它就不会进 history
真正麻烦的是时间戳和多终端同步——它们不依赖额外工具,但需要改环境变量和 shell 行为,一旦漏掉某个环节(比如忘了 PROMPT_COMMAND 或 HISTTIMEFORMAT 末尾空格),效果就断层。建议把配置写成小段落,逐行 source 测试,别堆在一起改完就跑。











