linux的history命令默认只显示当前会话内存缓存中的历史,不自动同步文件或其他终端记录;根本原因在于histsize(控制内存条数)和histfilesize(控制文件行数)双重限制,且异常退出会导致命令未写入文件。

Linux 的 history 命令默认只显示当前会话缓存的历史,不是“全部历史”,真正想查全,得同时看内存和文件两层数据。
为什么 history 只显示几十条或不全?
这不是 bug,是受两个变量控制:HISTSIZE(内存中保留条数)和 HISTFILESIZE(写入 ~/.bash_history 文件的最大行数)。新开终端时,它只加载文件里已有的记录,且不会自动合并其他终端刚执行的命令。
- 检查当前值:
echo $HISTSIZE $HISTFILESIZE—— 默认常为 1000 和 2000,但可能被系统或用户改小 - 临时扩大(当前会话有效):
HISTSIZE=5000; HISTFILESIZE=5000 - 永久生效:把这两行加进
~/.bashrc,然后运行source ~/.bashrc - 注意:上一会话若异常退出(如 kill -9),命令可能根本没写入文件,导致“消失”
Ctrl+R 搜索比 history | grep 更快更准
Ctrl+R 是 readline 实现的反向增量搜索,边输边匹配,支持回溯多轮,还能编辑后再执行。而 history | grep 只是静态文本过滤,不带编号、不能直接调用,还容易漏掉没刷新进内存的记录。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 按下
Ctrl+R后输入关键词(比如&或nohup),立刻高亮最近匹配项 - 继续按
Ctrl+R往前翻,按Ctrl+G或Esc退出搜索 - 找到后按
→键把命令展开到光标位置,可自由修改参数再执行 - 如果搜索卡住或无响应,可能是当前 shell 不是交互式(如脚本中),或终端未启用 readline
! 编号 和 !! 等事件替换在脚本里基本不能用
! 语法依赖 bash 的历史扩展(history expansion)功能,默认只在交互式 shell 中开启。非交互式 shell(如用 bash script.sh 运行的脚本)默认禁用,强行启用需加 set -o histexpand,但极易因变量未展开、引号错乱引发错误。
-
!123、!!、!$这些只应在终端手动操作时用 - 脚本中要复用命令逻辑,请用函数或变量,别依赖
!—— 它不可靠,也不可读 - 如果真要调试某条历史命令,先用
history | tail -n 20找编号,再复制粘贴,比!更稳
时间戳和敏感命令过滤必须手动配置
history 默认不记录时间,也不过滤重复或空格开头的命令 —— 这些都得自己设环境变量,且只对新记录生效。
- 加时间戳:在
~/.bashrc里加export HISTTIMEFORMAT="%F %T ",注意末尾空格不能少,否则格式错乱 - 跳过重复命令:
HISTCONTROL=ignoredups:erasedups;跳过以空格开头的命令:HISTCONTROL=ignorespace;两者都开:HISTCONTROL=ignoreboth - 忽略某些命令(如
ls):HISTIGNORE="ls:cd:pwd",但别滥用,否则审计时缺关键线索 - 旧记录不会自动补时间戳,
~/.bash_history里没时间的条目,永远不会有
最易被忽略的一点:多终端之间历史不同步是常态。你在一个终端执行了 git push,另一个终端敲 history 看不到,除非先运行 history -a(追加到文件)再 history -r(从文件重载)—— 日常使用中,没人会这么干,所以别假设“所有命令都在 history 里”。










