history命令默认仅显示当前会话最近1000条(由histsize控制),不自动同步多终端历史,需配合history -a/-n及prompt_command实现实时共享。

history 命令默认只显示最近 1000 条,不是全部历史
Linux 的 history 命令读取的是当前 shell 会话的内存缓存,不是直接翻硬盘日志。它默认只保留最近 1000 条(由 HISTSIZE 控制),而且不同终端会话之间不共享——你在一个窗口里执行了 500 条命令,新开个终端还是从头开始计数。
-
HISTSIZE控制内存中保存多少条(当前会话);HISTFILESIZE控制写入~/.bash_history文件时最多保留多少行(退出时才写) - 想查更早的命令,得先确保它们被写进文件:手动运行
history -a把当前会话新增命令追加到~/.bash_history - 多个终端同时工作时,容易漏掉其他窗口的命令——因为
history -a不自动触发,history -n才能从文件读取别人写入的新记录
搜索历史命令别只会用上下箭头,用 ! 和 Ctrl+R 更快
交互式搜索比翻页高效得多,但很多人卡在记不住快捷键或符号含义上。
- 按
Ctrl+R进入反向增量搜索,输入关键词(比如git push),实时匹配最近用过的命令;再按一次Ctrl+R查前一条匹配 -
!$表示上一条命令的最后一个参数,!!表示上一条完整命令,!n表示第 n 条历史编号(用history查编号) - 注意:
!开头的命令是立即执行的,不是预览——误输!rm可能直接删错东西,建议先用!cmd:p(比如!ls:p)只打印不执行
~/.bash_history 文件不实时更新,关机前可能丢命令
~/.bash_history 不是每敲一条就写一次磁盘,而是 shell 退出时才把当前会话的 HISTSIZE 条写进去。异常退出(断连、kill、崩溃)会导致刚输的命令彻底消失。
- 解决办法是在
~/.bashrc里加两行:export PROMPT_COMMAND="history -a; history -c; history -r"
这样每次回车后都立刻追加到文件、清空内存缓存、再重载全部历史(含其他终端写入的) - 但要注意性能影响:频繁 IO 可能拖慢高频率命令场景(如写脚本调试时一秒敲 5 条);普通使用完全无感
- 该方案对非交互式 shell(比如脚本里调
bash -c "...")无效,那些压根不读~/.bashrc
不同 shell 的历史行为差异很大,别默认 bash 那套在 zsh 里也管用
zsh、fish、dash 对历史的管理逻辑完全不同。比如 zsh 默认启用 INC_APPEND_HISTORY,命令执行完就写文件,不用等退出;而 dash 根本不支持 history 命令。
- 确认当前 shell:
echo $SHELL或ps -p $$ - zsh 用户改历史大小用
HISTSIZE和SAVEHIST(后者对应文件行数),且默认开启共享历史(SHARE_HISTORY) - fish 用户用
fish_history命令,历史存在~/.local/share/fish/fish_history,格式是纯文本带时间戳,可直接grep - 跨 shell 混用时,
~/.bash_history和~/.zsh_history是两个文件,互不干扰










