所有 shell 会话的历史记录都没有我想象的那么有用!

所有 shell 会话的历史记录都没有我想象的那么有用!

我主要使用 Terminator,它通常以 3 个分割终端窗口打开。出于各种原因,我也使用 Gnome 终端。
我想知道在这种情况下如何处理 bash 历史记录,因为当我运行history

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

另外,在使用 Terminator 后启动 Gnome Terminal 时,无论之前在 Terminator 中发出的所有命令如何,我都会在启动时看到第 100 行

答案1

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

export PROMPT_COMMAND='history -a'

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

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

因此,在输入该行之后,/etc/bash.bashrc我不会因为懒得使用终端而重新发明轮子或浪费宝贵的时间重新输入内容。

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

也可以看看:

答案2

在多次阅读之后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

所有 shell 会话的历史记录都没有我想象的那么有用!

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

哇,我太失望了。

从本质上讲,这样做会使 up/dn arrow 变得毫无用处。因为现在每个历史会话都充斥着来自其他会话的命令。对我来说,这失去了历史的最佳功能。

我真正想要的

有时,我希望将历史记录从一个终端会话转移到另一个会话,以便我可以轻松调用该会话中的命令。而且我可以非常有选择地做到这一点。

我做了什么

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

alias ha="history -a"
alias hb="history -a; history -r"
alias hr="history -r"
alias hl="history | tail -20"
HISTIGNORE="ha:hb:hr:hl"

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

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

  • A: ha- 附加会话A历史到历史文件
  • 乙: hb- 附加会话历史到历史文件然后读取文件

这实际上保留了会话的历史顺序并添加会话A列表中更深层次的历史。

对我来说非常有用。也许对你也有帮助!

答案4

history从所有终端显示:

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

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


相关内容