追踪 Zsh 历史数据丢失的幕后真相

Tracking down a Zsh history data loss bug

多年来,我常发现 Zsh 历史文件中莫名丢失了确信执行过的命令。起初我以为是备份问题,但深入调查后发现是 Zsh 自身的 bug。通过 inotify、fatrace 和 bpftrace 等工具追踪文件操作,我最终定位到问题根源:Zsh 在特定条件下读取历史文件时未读至末尾,导致数据截断。为了复现并确认问题,我甚至修改了 Zsh 源码使其在写入不完整历史时主动崩溃,并分析核心转储文件。最终,Zsh 5.9.2 版本修复了该问题。

最终,通过修改 Zsh 源码使其在写入不完整历史时主动崩溃,并分析崩溃产生的核心转储文件,成为了定位问题的制胜策略!
  1. mmh0000

    我有近十年的 zsh 历史记录。读完那篇文章后,我得出结论:我过去可能也遇到过那个 bug,只是没注意到。

    接着我继续读下去,作者提到了不小心导出 HISTFILE[1],我吓得尖叫起来,赶紧跑向电脑,因为我意识到自己一直犯的一个错误……

    现在我对读了这篇文章既感到高兴又感到难过。

    [1] https://github.com/stapelberg/configfiles/commit/32dcda0f49a...

  2. inigyou

    几年前我就遇到过这个问题(或者是非常相似的 bug)。因为丢失所有历史记录实在太烦人了,我开始定期备份历史文件。我会继续备份,但这个修复方案值得感谢!

  3. pratyahava

    这算个 bug?bash 上我经常遇到这种情况,只要同时打开两个终端……最后关闭的那个才会写入历史记录。/shrug

同日更多故事

2026-08-15