如何防止清除 bash 历史记录?

kra*_*mir 6 shutdown bash command-history i3

按照答案

同时关闭多个 bash 实例时,存在一个已知的竞争条件,可能会导致历史记录被清除。发生这种情况是因为写入 bash 历史文件时没有使用锁定。

如何防止 bash 历史清除的原因?

我使用 i3wm,我认为它主要发生在我在手动关闭urxvt终端之前关闭计算机时。用于关闭的命令(通过键绑定)是systemctl poweroff.

小智 3

竞争条件的根源是因为 bash 仅在 shell 退出时写入历史文件。另外,如果多个 shell 正在运行,它会覆盖现有的历史文件,只有最后退出的才会主导历史记录。

因此,一种解决方案是在每个命令之后写出历史记录。这样做会产生一些负面后果,例如您将能够向上箭头查看其他窗口中发生的历史事件,因此将向所有打开的 shell(您拥有的)公开您刚刚运行的命令。最有可能出现这种情况的地方是,如果您正在执行一组重复的命令,例如一遍又一遍地“向上箭头 N 次,然后按 Enter 键”。如果在关闭的窗口中后台进程结束,那么您突然需要更加密切地注意哪个命令实际上是“向上箭头 N+1 次”,冒着运行错误命令的风险。

要打开“每个命令的历史记录”,请尝试将这些添加到您的 .bashrc (要存储的历史记录行数只是示例,您可以根据需要更改它们)

HISTFILESIZE=400000000
HISTSIZE=10000
PROMPT_COMMAND="history -a"
export HISTSIZE PROMPT_COMMAND

shopt -s histappend
Run Code Online (Sandbox Code Playgroud)