使用 histappend 时 Bash 历史记录丢失

Cas*_*bel 20 bash history

我喜欢保留很多历史,所以我histappend在我的.bashrc. 大多数情况下,一切正常,历史记录是由许多 shell 附加而成的。然而,每隔一段时间,我会启动一个新的 shell 并发现我已经丢失了整个历史——而且它通常只包含来自最后一个 shell 的一些退出命令(即它不仅仅是覆盖而不是附加)。因此,我怀疑它是在 shell 退出时发生的,而不是在其他一些进程杀死.bash_history文件时发生的。支持这个结论,我的提示中有历史命令编号,而且我从未见过它们跳下来。

有人遇到过类似的问题吗?或者甚至只是有关于如何追踪问题的建议?

Cas*_*bel 15

很抱歉回答我自己的问题,但其他答案都没有真正解决问题。

我终于发现这只会在关闭gnome-terminal自身时发生(即文件 > 退出,'x' 按钮,alt+F4),即使这样,通常也只有在快速连续关闭多个终端时才会发生。使用 ctrl-D 关闭外壳时,它永远不会发生,让终端跟随。

如果我能很好地确定它,我将提交一份 gnome-terminal 错误报告。与此同时,也许这会帮助其他一些从谷歌来到这里的人!


inn*_*naM 13

不知道为什么会发生这种情况,但也许您可以通过强制 bash 每次显示提示时写入其历史文件来规避该问题:

PROMPT_COMMAND="history -a; history -n"
Run Code Online (Sandbox Code Playgroud)

每次 bash 提示输入下一个命令时,这将写入 (-a) 然后重新读取 (-n) 历史文件。额外的好处:您将在 shell 2 的历史记录中在 shell 1 中获得命令 X。

  • `history -n` 是片状的。执行`history -a; 更可靠;历史 -c; 历史 -r`。为了解释这一点,我首先要指出 `history -a` 做了正确的事情 - 你的 `.bash_history` 将包含你输入的所有命令,按照你输入的顺序 - 假设你运行 `history -a ` 在每个命令之后。挑战在于保持 shell 的历史概念与 .bash_history 文件同步。使用 `-c` 和 `-r` 很容易,问题是如果它很大,它可能会很慢。`-n` 可能会中断,因为它错误地标识了哪些行是新行。(我这里的空间用完了!) (5认同)
  • (...如果你使用 `-n`)想象你在 shell 1 中执行一个命令:`ls`。然后在另一个 shell,Shell Two 中,你执行 `cd`。现在,.bash_history 中的历史记录是正确的,因为在你的 `PROMPT_COMMAND` 中有 `history -a` - 它将包含 `ls \n cd \n`。接下来,您返回到 shell One 并键入 `pwd`。Shell One *认为*历史记录中只有一条命令(`ls`)。现在它认为历史中有两个命令(`ls` 和`pwd`)。当您执行 `-n` 时,它认为(我的历史记录中有两个命令,.bash_history 中有两个命令,因此我是最新的。) (4认同)
  • 你能解释一下“不起作用”是什么意思吗? (3认同)
  • 您引用的额外好处在许多情况下是不利的。这不是我正在寻找的行为,因为我可能在不同的 shell 中执行两个完全独立的任务,并且不想混合它们的历史。这也可能无济于事。当历史记录消失时,它正在删除 .bash_history 的内容 - 我不认为它们是在 shell 退出时写入还是由 PROMPT_COMMAND 写入无关紧要。 (3认同)

Axx*_*err 1

我以前见过这种情况发生,但这是一个磁盘错误发生频率不断增加的问题。我会在驱动器上运行扫描。如果结果证明驱动器没有问题,我会检查该文件是否没有超过任意 shell 历史记录限制。

可能能够阻止这种情况发生的方法是不断将文件削减到 80 行,或者您想要历史记录的命令数量。