使用多个终端处理 Bash 历史记录

zet*_*tah 130 command-line bash history

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

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

在使用 Terminator 后也启动 Gnome Terminal 我在启动时得到第 100 行,不管之前在 Terminator 中发出的所有命令

jco*_*ado 129

保存的 bash 会话是最近关闭的终端的会话。如果你想为每个会话保存命令,你可以使用这里解释的技巧。

export PROMPT_COMMAND='history -a'
Run Code Online (Sandbox Code Playgroud)

引用联机帮助页:“如果设置,则在发出每个主要提示之前,该值将作为命令执行。”

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

因此,在/etc/bash.bashrc输入该行之后,我不必发现自己重新发明轮子或浪费宝贵的时间来重新输入内容,因为我对我的终端很懒惰。

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

也可以看看:

  • @VineetMenon 有关更多详细信息,请参阅[此处](http://www.faqs.org/docs/bashman/bashref_106.html)。有趣的部分:当 shell 启动时,历史记录从 HISTFILE 变量命名的文件(默认“~/.bash_history”)初始化。[...] 当交互式 shell 退出时,最后的 $HISTSIZE 行将从历史列表复制到 $HISTFILE 命名的文件中。 (3认同)
  • 出色的。感谢您的解释和解决方案。我尝试使用 `export PROMPT_COMMAND='history -a; 历史 -r'` 并且我在终端中得到了一些奇怪的历史行号 - 在发出一些命令后历史行号跳到 2000 而不是 1,这很奇怪,但它的行为如上所述 - 所有终端历史记录都被保存。 (2认同)
  • [不需要`export`。](https://unix.stackexchange.com/q/107851/154671) (2认同)

wal*_*tor 37

在多次阅读 之后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  
Run Code Online (Sandbox Code Playgroud)

到我的~/.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在排序链中)。

  • 为什么要分配两次`HISTFILESIZE`? (3认同)
  • 这应该是一个新问题,但我认为这不是一个好主意。我使用`egrep 'whatever' .history/*`(或`cat .history/* | egrep 'whatever'`)代替,并使用Ctrl-r 来搜索单个会话的历史记录。阅读关于 history 命令的 `man bash-builtins`。我的`sort .history/* | uniq -c | 排序 -n | wc -l` 显示 16033 个独特的命令,`cut '-d ' -f1 .history/* | 排序 | uniq -c | sort -n` 显示 2004 年独特的命令,主要是拼写错误。将所有这些加载到 bash 的“历史列表”中无济于事。 (3认同)
  • 通过将 HISTFILESIZE 设置为 0,我清除了历史缓冲区并重置了历史保存机制。然后,我设置了我真正想要的大小,并开始在 HISTFILE 中保存历史记录。请参阅“man bash”的“历史”部分。 (2认同)
  • 有没有办法合并历史文件以使`Ctrl + r`再次工作? (2认同)

小智 15

所有 shell 会话的历史记录没有我希望的那么有用!

我满怀热情地设定PROMPT_COMMAND='history -a; history -r',希望我的历史记录使用能更好!

哇,我很失望。

本质上,这样做会使 up/dn 箭头变得无用。因为现在每个历史会话都充斥着来自其他会话的命令。对我来说,这失去了历史上最好的特征。

我真正想要的是什么

有时,我想将我的历史记录从一个终端会话转移到另一个会话,以便我可以轻松地回忆起该会话中的命令。我可以非常有选择性地做到这一点。

我做了什么

我设置了一系列简单的历史操作别名,并且忽略历史记录中的这些命令:

alias ha="history -a"
alias hb="history -a; history -r"
alias hr="history -r"
alias hl="history | tail -20"
HISTIGNORE="ha:hb:hr:hl"
Run Code Online (Sandbox Code Playgroud)

我认为hb历史的融合……其他的都是不言自明的。

现在,当我想将历史记录从会话 A 复制到会话 B 时,我可以这样做:

  • A: ha - 将会话A历史记录追加到历史文件中
  • B: hb - 将会话B历史记录附加到历史文件中,然后读取该文件

这实质上保留了会话B的历史记录顺序,并将会话A历史记录添加到列表的更深处。

对我来说超级有用。也许对你也有帮助!


小智 10

另请参阅“在 bash 中保持持久历史”以获取另一种选择。它操纵您的提示,将输入到任何终端的所有命令发送到“持久历史”文件中(以及通常为常规执行的操作.history)。

  • 是否可以使替代历史记录与 CTRL-R 历史记录搜索一起使用? (3认同)

Eli*_*ynn 9

history从所有终端显示:

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

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


  • 我会说,在使用了几个月之后,我最终在最近才评论了这一点。这是苦乐参半,因为我并不总是想筛选最后 100 个命令只是为了运行我最初在 Tmux 窗格中运行的命令我有时可能有一个专用的日志命令,我需要重新启动。 (3认同)
  • Fish shell 提供的一个很好的解决方案是“history --merge”。我已经使用这个方法一年左右了,它解决了这个问题。当我想要其他会话的最新历史记录时,我只需运行该命令即可立即使用。 (2认同)

use*_*944 5

如果您想要一个更完整的解决方案,在本地保留 bash 历史记录,存储附加上下文(cwd、运行时、退出代码等)并将其同步到其他计算机,请参阅history。我对 shell 历史记录的不当行为感到沮丧,这是我解决问题的方法。