history 默认只显示最近几十条是因为 histsize 限制内存中保存的命令数量,且新终端未同步其他终端的历史记录;需调整 histsize/histfilesize、启用 histtimeformat、注意 histcontrol 规则及多终端同步机制。

history 命令为什么只显示最近几十条?
默认情况下,history 只显示当前会话中已加载的命令(通常最多 1000 条),但实际可见数量受两个变量控制:HISTSIZE(内存中保留条数)和 HISTFILESIZE(写入 ~/.bash_history 文件的最大行数)。如果你新开终端后 history 显示很少,大概率是 HISTSIZE 被设小了,或上一会话没正常退出(导致命令未写入文件)。
检查当前设置:
echo $HISTSIZE $HISTFILESIZE
临时增大(当前会话生效):
HISTSIZE=5000; HISTFILESIZE=5000
永久生效需写入 ~/.bashrc,注意:修改后要 source ~/.bashrc 或新开终端才生效。
如何搜索并复用历史命令?
比翻页更高效的是直接检索。最常用的是 Ctrl+R(reverse-i-search):按下后输入关键词,实时匹配最近的匹配项;连按 Ctrl+R 可向前遍历更早的匹配。退出搜索按 Ctrl+G 或 Esc。
命令行中也可用:
-
history | grep "ssh"—— 粗略筛选,但不带行号且无法直接执行 -
!123—— 执行第 123 条命令(行号来自history输出) -
!!—— 重复上一条命令 -
!$—— 引用上条命令的最后一个参数(比如ls /tmp后接cat !$相当于cat /tmp)
注意:! 语法在脚本中默认禁用,需手动启用 set -o histexpand,生产脚本里尽量避免,易出错。
history 时间戳怎么开启?
默认 history 不显示时间,调试多任务或排查误操作时很不方便。启用方法是在 ~/.bashrc 中添加:
HISTTIMEFORMAT="%F %T "
然后 source ~/.bashrc。之后每条记录前会加上日期和时间(如 2024-06-15 14:22:03 ls -l)。
注意两点:
- 该设置只影响新记录,已有
~/.bash_history文件里的旧条目不会自动补时间 - 时间戳格式支持
%Y %m %d %H:%M等标准strftime占位符,但别加非法字符(如中文引号、空格过多),否则可能导致history显示错乱
为什么有些命令没进 history?
不是所有命令都会被记录。以下情况会被跳过:
- 以空格开头的命令(由
HISTCONTROL中的ignorespace控制,常见于密码类敏感操作) - 与上一条完全相同的命令(
ignoredups) - 同时含两者(
ignoreboth) - 命令长度超过
HISTSIZE字符限制(默认无硬限制,但极长命令可能被截断) - 非交互式 shell(如脚本中调用的 bash)默认不启用 history
想强制记录某条带空格的命令?去掉开头空格,或临时改 HISTCONTROL:
HISTCONTROL=; your_command
不过这属于权宜之计,敏感信息还是别记为好。
真正容易被忽略的是:多个终端同时运行时,history 不会自动同步。一个终端执行的命令,另一个终端得先 history -a(追加到文件)再 history -n(从文件读取)才能看到——这点在长期维护服务器时特别容易踩坑。










