使用histappend时Bash历史记录丢失


17

我喜欢保留很多历史,所以我已经histappend设置了.bashrc。在大多数情况下,一切工作正常,并且通过附加许多外壳建立了历史记录。但是,每隔一段时间,我将启动一个新的Shell,并发现我失去了整个历史记录-而且它通常仅包含最后一个Shell中要退出的一些命令(即,不只是覆盖而不是追加) )。因此,我怀疑它是在shell退出时发生的,而不是其他原因导致.bash_history文件被杀死的情况。支持这一结论的是,我的提示符中包含历史命令编号,但我从未见过它们跳下来。

有人遇到过类似的问题吗?甚至只是对如何找到问题有建议?


Answers:


13

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

我终于弄清楚,这仅在关闭gnome-terminal自身时发生(即,文件>退出,“ x”按钮,alt + F4),甚至通常仅在快速连续关闭多个终端时才发生。使用ctrl-D关闭外壳,让终端跟随,它永远不会发生。

如果可以将其固定得足够好,我将提交gnome-terminal bug报告。在此期间,也许这会对从Google到这里的其他人有所帮助!


10

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

PROMPT_COMMAND="history -a; history -n"

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


在GNU bash 3.00.15(1)-发行版(i686-redhat-linux-gnu)上不起作用
David Mackintosh,2009年

2
您能否解释“无效”的含义?
innaM

3
您引用的其他好处在许多情况下是不利的。这不是我要寻找的行为,因为我可能正在不同的shell中执行两个完全独立的任务,并且不想混合它们的历史。这也可能无济于事。历史记录消失后,它将删除.bash_history的内容-我不认为它们是在shell出口还是由PROMPT_COMMAND编写的。
卡斯卡贝尔

4
history -n是片状的 这样做更可靠history -a; history -c; history -r。为了解释这一点,我首先会注意history -a做正确的事情.bash_history-假设您history -a在每个命令之后都运行,那么您将按键入顺序包含所有键入的命令。面临的挑战是使shell的历史记录概念与.bash_history文件保持同步。使用-c和很容易-r,问题是如果它很大,可能会变慢。-n可能会中断,因为它错误地标识了哪些行是新行。(我的空间

3
(...,如果使用的话-n)想象一下,您在shell 1中执行了一条命令ls。然后在另一个外壳程序Shell 2中执行cd。现在,.bash_history中的历史记录是正确的,因为history -a您的PROMPT_COMMAND-中将包含ls \n cd \n。接下来,返回外壳One并输入pwd。Shell One 认为历史记录(ls)中只有命令。现在,它认为历史记录中有两个命令(lspwd)。当您这样做-n时(我的历史记录中有两个命令,而.bash_history中有两个命令,因此我是最新的。)
Aaron McDaid 2012年

3

我的经验是,shell在退出时更新了历史记录文件。因此,shell的初始“历史”取决于最近退出的shell对历史的看法。

这样的结果是,您可以从历史记录中获取来回命令,这取决于其他外壳程序的启动和停止方式。


2
我非常了解历史记录文件的编写方式,这就是为什么我在问题中指定要使用的文件histappend。问题不是意外的内容,而是先前存储的内容的全部丢失。
卡斯卡贝尔

这解释了为什么我失去了自己的历史……
B 2012年

1

我以前见过这种情况,但这是磁盘错误的问题,这种错误的发生频率越来越高。我会在驱动器上进行扫描。如果发现驱动器正常,我将检查该文件是否未超过任意的外壳历史记录限制。

可以阻止这种情况发生的方法是将文件修剪回80行,或者不管您希望历史记录使用多少命令。


我没有发生这种情况的机器上的root用户访问权限,但我相当有信心该驱动器还可以。我的主目录存储在我们实验室的服务器上(我相信有很多RAID),并且已通过nfs挂载。您所说的“任意外壳历史记录限制”是什么意思?这一切都发生在HISTSIZE和HISTFILESIZE以下,并且尽管我都设置了较大值,但它们远低于int将它们存储为bash的程度。
卡斯卡贝尔

我不得不说,大卫·麦金托什(David Mackintosh)的入职可能正在发生。
Axxmasterr

1
我完全可以肯定不是。在我的历史记录中,我永远不会仅以两个命令结束,当最后一个退出的外壳程序有几十个命令,历史文件包含数百个命令,并且HISTSIZE / HISTFILESIZE设置为
10000。– Cascabel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.