具有多个终端的Bash历史记录处理


110

我主要使用终结者,通常使用3个分割的终端窗口打开。由于各种原因,我也使用Gnome终端。
我想知道在这种情况下如何处理bash历史记录,因为有时我在运行时会错过以前发出的命令history

例如,我的提示显示当前的bash历史记录行(\!),并且如果我使用3个拆分的终端窗口启动Terminator,则在所有终端上都会得到相同的历史记录行(假设为100)。将保存哪个历史记录?

在使用终结者后也启动Gnome Terminal我在启动时得到了第100行,无论之前在终结者中发出的所有命令如何


Answers:


107

保存的bash会话是最近关闭的终端的会话。如果要为每个会话保存命令,则可以使用此处说明的技巧。

export PROMPT_COMMAND='history -a'

引用手册页:“如果设置了该值,则在发出每个主提示之前,将其作为命令执行。”

因此,每当我的命令完成时,它会将未写入的历史记录项附加到,~/.bash_history然后再次显示提示(仅$ PS1)。

因此,在完成这一任务后,/etc/bash.bashrc我不必因为自己对终端机很懒惰而重新发明轮子或浪费宝贵的时间重新输入内容。

无论如何,您需要考虑到来自不同会话的命令将混入您的历史记录文件中,因此以后阅读它不会那么简单。

也可以看看:


不是为不同的TTL单独存储吗?
Vineet Menon

优秀的。感谢您的解释和解决方案。我尝试了一下,export PROMPT_COMMAND='history -a; history -r'并在终端中得到了一些奇怪的历史行号-在发出一些命令历史行号后跳了2000,而不是跳了1,这很奇怪,但它的行为与上面一样-保存了所有终端历史。
zetah 2011年

@VineetMenon有关更多详细信息,请单击此处。有趣的部分:当shell启动时,历史记录将从HISTFILE变量(默认为〜/ .bash_history)命名的文件中初始化。[...]退出交互式外壳程序时,最后的$ HISTSIZE行将从历史记录列表复制到$ HISTFILE命名的文件中。
jcollado



32

多次阅读后man bash,我为每个shell使用单独的历史记录文件。我做了一个mkdir -m 0700 ~/.history然后添加

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

对我的~/.bashrc。我不时地记得du -sk .history并清理它。最好将我键入的每个命令都保留下来。

我只是使用上面的代码来查看我最近在做什么:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less

cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(或将第一个参数包含sudo mount在排序链中)。


3
为什么要分配HISTFILESIZE两次?
丹尼尔(Daniel)

2
通过将HISTFILESIZE设置为0,我清除了历史记录缓冲区并重置了历史记录保存机制。然后,设置我真正想要的大小,然后开始将历史记录保存在HISTFILE中。请参阅的“历史记录”部分man bash
waltinator 2012年

1
有没有一种方法可以合并历史记录文件以重新Ctrl+r工作?
n611x007 2013年

3
这应该是一个新问题,但我认为这不是一个好主意。我改用egrep 'whatever' .history/*(或cat .history/* | egrep 'whatever'),然后使用Ctrl-r搜索单个会话的历史记录。了解man bash-builtins历史记录命令。我sort .history/* | uniq -c | sort -n | wc -l显示了16033个独特的命令,cut '-d ' -f1 .history/* | sort | uniq -c | sort -n显示了2004年独特的命令,主要是错别字。将所有内容加载到bash的“历史列表”中将无济于事。
waltinator 2013年

@waltinator-我知道这是一条旧评论,但是您是否暗示设置环境变量会以某种方式触发立即采取的措施?您将在本地shell中为HISTFILESIZE分配值为0并立即更改为4096的事实是什么?这是关于bash处理某些变量名的未记载的东西吗?
不同步

8

要从history所有终端显示:

添加export PROMPT_COMMAND='history -a; history -r'到您的.bashrc文件。

资料来源:http : //northernmost.org/blog/flush-bash_history-after-each-command



3
我要说的是,在使用了几个月之后,我最近才对此做出评论。这真是苦乐参半,因为我并不总是希望仅浏览最后100条命令来运行我最初在Tmux窗格中运行的命令,有时我可能需要专用的log命令来重新启动。
伊利亚·林恩2014年

鱼壳提供的一个很好的解决方案是history --merge。我已经使用了一年左右,它可以解决问题。当我需要其他会话的最新历史记录时,我只需运行该命令,即可立即使用它。
伊利亚·林恩

不需要导出。
有限赎罪

6

另请参阅“ 将历史持久保存在bash中 ”。它会提示您将曾经在任何终端中键入的所有命令发送到“永久历史记录”文件中(以及常规命令的常规操作.history)。


1
我插入$$以使该行成为echo $$ $date_part "$command_part" >> ~/.persistent_history此项的前缀,并使用bash进程的PID作为条目的开头,以便我们可以区分多个历史记录。
Evgeni Sergeev '18

可以使替代历史记录与CTRL-R历史记录搜索一起使用吗?
最多
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.