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

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

回答:

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

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

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

答案1

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

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

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

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

shopt -s histappend

答案2

当您启动 bash 时,如果您的历史记录已被删除(按行数衡量),它会警告您。如果历史记录未被删除,则会进行备份。

~/.bashrc

# backup history/warn about deleted history
if (( $(wc -l < ~/.bash_history) < 1100 ))
then
    echo "#########################"
    echo ".bash_history was cleared"
    echo "#########################"
else
    cp ~/.bash_history ~/.bash_history.back
fi

答案3

我的解决方案是在注销之前将内存中的历史记录与磁盘上的历史记录合并......

请注意,它这样做的同时保留了历史时间戳排序以及这些时间戳内的命令顺序。

根据定义的 perl RE,可以选择删除唯一命令(即使是多行),和/或删除(清除)简单和/或敏感命令。调整以适应!

这就是结果...https://antofthy.gitlab.io/software/history_merge.bash.txt

我通过 shell 别名“hc”(用于历史记录清理)“按需”获取该脚本,并从“.bash_logout”配置文件获取该脚本,以便在退出之前合并/清理。

享受。

相关内容