如何让 bash 永远保留最常用的历史条目?

Kar*_*ter 5 linux bash history command-line

重复项已经关闭,但这还不够(我觉得我必须经常输入命令)。

假设我有 2000 条bash历史记录和一个我过去经常使用(n多次)但最近不使用的命令,现在我想再次使用。假设此命令位于历史记录中最旧的位置,并且将在下一次非重复命令执行后被逐出。我希望保留此命令,并将最旧的命令(使用计数 < n)从历史记录中逐出。

有人可能会争辩说,这使得bash历史不再是(线性)历史。我同意,但不在乎,因为我想轻松访问我最喜欢的命令(自动收集)。

bash在 Ubuntu 15.10 上使用4.3.42。

Edw*_*ard 4

警告:这并不是问题的答案,而是对您可能认为有用的方法的建议。

我感受到你的痛苦。我也喜欢保留我的 Bash 历史记录,并且能够回忆起我很久以前运行过的命令。我开发了一种方法,使我能够将所有 Bash 历史记录保持在合理的历史记录大小内。

  1. 我的 Bash 历史记录设置是:

    HISTCONTROL=ignoreboth:erasedups
    HISTIGNORE="?:??:???:$HISTIGNORE"
    
    Run Code Online (Sandbox Code Playgroud)

    这有助于减少最终出现在 Bash 历史记录中的条目。像这样的命令ls输入起来比调用起来要短,所以存储它们是没有意义的(这就是目的HISTIGNORE)。ignorebothignorespaceand的简写ignoredups。前者防止带有前导空格的条目最终出现在历史记录中。我将它用于我知道我永远不会回忆起或永远不想回忆起的命令,例如 rm -rf *:)。默认情况下,我会忽略更多内容(未显示),这会减小历史记录的大小。

  2. 尽管采取了上述对策,重复项仍然出现在我的历史记录中(例如,由于同时打开多个 Bash shell)。我的提示中有一个计数器,显示当前的历史记录大小

    PS1='\u@\h:\w:\!> '
    
    Run Code Online (Sandbox Code Playgroud)

    (相关代码是\!,又名该命令的历史编号。)这向我展示了何时需要“清理”(请参阅​​下一步)。

  3. 我通过运行以下命令定期“清理”我的 Bash 历史记录:

    tac ~/.bash_history | awk '!seen[$0]++' | tac > ~/.bash_history.new && mv ~/.bash_history.new ~/.bash_history
    
    Run Code Online (Sandbox Code Playgroud)

(当然假设您的 Bash 历史记录存储在~/.bash_history其中)。此命令在尊重顺序的同时删除重复项:最后使用的命令保留在最后。仅保留最后一个(最近的)重复项。

通过这种方法,我能够将所有 Bash 历史记录保持在 600 到 1000 个条目的非常适度的历史记录大小内。