两个独立 shell 历史列表通过 HISTFILE 连接:会话 A 用 -a 追加,会话 B 用 -n 导入。

bash history 是可以搜索的命令日志

命令历史能减少重复输入,却不是所有已执行操作的完整记录。Bash 通常在交互 Shell 中启用历史功能,配置还可以过滤条目或限制保留数量。运行中 Shell 的可搜索列表,与磁盘上的历史文件,是两个独立状态。理解这个区别,才能解释为什么某条命令在一个终端能找到,在另一个终端却没有,以及为什么意外结束会话可能丢掉尚未保存的记录。 每个运行中的 shell 都有独立历史列表,只有显式文件操作才连接这些状态。追加不会刷新另一会话,读入整个文件可能产生重复,替换则可能丢失其他会话记录。共享历史不是可信的全局执行日志。 会话内存与历史文件不同 HISTSIZE 限制内存中的历史条目数量,HISTFILESIZE 使用按行计算的目标控制文件保留。当前 Bash 手册允许为了保留完整多行条目而超过这一目标,避免留下半条记录。多行命令与时间戳记录也会让原始文件行数不等于命令数,不能据此直接判断保留了多少次操作。HISTFILE 决定保存位置,通常指向用户的 Bash 历史文件。变量未设置或为空时不会正常保存;目标不可写时,当前会话仍可能查到记录,却没有对应的持久化副本。 Bash 在参数展开之前、历史展开之后记录命令文本,并受到 HISTCONTROL 与 HISTIGNORE 的影响。因此,保存下来的变量引用并不一定显示原来执行时的变量值。当前目录、别名、函数、环境及外部文件,也都可能在下次复用命令之前发生变化。历史保存的是有用的输入,不是完整的可复现运行环境,更不是可以直接信任的操作审计证据。 追加保存不会自动刷新其他终端 Bash 正常退出时保存历史,histappend 决定追加到文件还是覆盖文件。如果此前没有主动保存,异常终止可能丢掉全部未写入的条目,不只是最后一条。history -a 追加当前会话新输入、且尚未追加过的历史行。提前保存可以缩小丢失窗口,但不等于承诺任何系统故障之后都能完整恢复,更不能把一次文件写入等同于业务日志的可靠持久化。 另一个仍在运行的 Shell 持有自己的列表,需要通过 history -n 等操作读取新追加的行。仅仅启用追加选项,不会让另一个终端的搜索结果实时更新。history -r 把整个文件内容追加到现有列表,重复运行可能制造重复条目;history -w 则用当前列表替换文件,可能丢掉其他会话留下的记录。这些命令的方向和覆盖语义不同,不能当作几种等价的同步写法。 ...

二月 28, 2028 · 1 分钟 · XB Field Notes