是否可以立即写入.bash_history?


124

我常开很多很多终端的[现在我有7对这个工作区中打开]我经常搜索historygrep查找我刚写的一个最近的命令,但我不希望追捕终端,然后向上滚动并继续寻找它,等等。有时我的终端没有“退出”就关闭了,我写的所有东西都丢失了(有时我需要在被杀的终端上写一些东西)。

那么有没有一种方法可以使每个终端立即写入.bash_history?或至少每分钟一次,或类似的东西?


2
通常,我使用control-r反向搜索一次bash的命令历史记录。比history | grep除非您需要正则表达式更方便。
彼得·科德斯

Answers:


92

一个简单的解决方案,如“ 实时更新Bash历史记录”中所述

它说将这些命令放在.bashrc配置中:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

第一个命令将.history文件模式更改为追加。第二个history -a命令配置要在每个shell提示符下运行的命令。该-a立即写入当前的/新线,以历史文件。

与zsh相关:


1
好这种作品。我尝试了更多测试,似乎只对第一个命令起作用。对您来说正确吗?
马特

54

尝试将其放入您的.bashrc

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

信用在这里:https//stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -c清除正在运行的会话的历史记录。这将减少历史记录计数器的数量$HISTSIZEhistory -r阅读其中的内容$HISTFILE并将其插入当前正在运行的会话历史记录中。这会使历史记录计数器增加中的行数$HISTFILE

我认为这意味着这些命令几乎立即可用(您有一个终端,write echo 1,第二个终端echo 2,第一个终端,echo 3并且在两次按下向下箭头时,您应该已经echo 2可用。您必须在给定终端中发出命令才能访问已被写。


辉煌!谢谢。想知道为什么这些选项没有记录在man history...中
artfulrobot

10
@artfulrobot:此命令是bash内置命令,请参见中的描述man bash。您也可以使用help history
pabouk

2
我的zsh配置如下:每个shell跟踪其OWN历史记录(在此之前,是组合历史记录),并且每个命令都附加到组合历史记录之后。这与总是为每个shell重新加载每个命令的历史记录有所不同,并且更好,因为我倾向于为每个shell终端使用不同的“工作线程”或“作业”。我认为,这与-r-c与仅具有之间的区别-a
史蒂文·卢

那你到底在用什么呢?history -c; history -r?我想这对您更好,仅对我而言这会更好,我经常使用多个shell来完成一项工作,因此我希望将历史尽可能多地结合起来。我实际上介意该命令仅在完成后才写入历史记录。通常,当我启动到一个主机的ssh会话并想在第一个仍在运行时打开另一个主机时,我必须重新输入它,因为它尚未被写入历史记录。
sup 2015年

我想我花了很长时间才弄清楚如何让bash同时跟踪历史记录的并行线程(基于shell实例),同时立即将历史记录写入主历史记录文件。使用Zsh可以更轻松地完成此操作,此外,我还定义了一个zsh函数,可以将大量奇特的元数据写到我设计的增强历史文件中。它变得不可缺少。无论如何,zs​​h都有precmd()和preexec()的机制发送了描述所输入命令的args。然后,将其定向到文件变得很简单。history -a可能就够了
史蒂文·卢

38

我有一个大的历史文件,大约有100000个条目,并且清除历史列表并读取整个历史文件的变体(使用history -chistory -r)会在显示提示之前引入明显的延迟(可能是0.2秒)。使用history -n以便从历史文件中仅读取新行更快:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND 不必导出,因为它是一个shell变量。


辉煌!连接断开时不再丢失历史记录!
托比亚

太好了 通过附加到文件并从文件读取,它将在多个终端之间共享历史记录。
wisbucky

3

所有其他答案的注释(基本上是同一件事):

设置PROMPT_COMMAND="history -a;$PROMPT_COMMAND".bashrc(或朋友)就足够了。

另外,history -a只要您想“快照”当前会话中的历史记录,就可以手动运行。

shopt -s histappend不需要该命令,因为history -a总是将新行添加到文件中,而不会覆盖它。同样,至少从Bash 4开始,histappend它是默认行为。


在我的Mac 10.13.6上,如果没有,它似乎无法工作shopt -s histappend。另请注意,我已将其添加到我的~/.bash_profile
ubershmekel,

您的系统中可能有另一个禁用的设置histappend,因为这是默认行为。我会寻找它,但是我无法使用Mac。
格斯,
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.