为什么 bash 仍然保留带有擦除的重复行?

phu*_*clv 6 bash command-history

我的 ~/.bashrc 中有以下行

export HISTCONTROL=ignoreboth:erasedups
Run Code Online (Sandbox Code Playgroud)

但是,每当我运行somecommand它时,它都会.bash_history像这样添加重复的命令

grep -w somecommand ~/.bash_history
somecommand
somecommand abc xyz
somecommand 123
somecommand
...
Run Code Online (Sandbox Code Playgroud)

为什么会这样以及如何预防?

小智 8

erasedups选项将删除受这两个条件限制的重复行:

  • 这些行将从内存列表中删除。
  • 仅当新命令要添加到列表中时。

内存中的列表是 的输出history
当 bash 关闭时,“内存中”的整个列表将被写入文件history -w(如果未设置 histappend)。

所以,如果内存中的列表是:

$ history
1  cmd1
2  cmd2
3  cmd3
4  cmd1
5  cmd2
6  export HISTCONTROL=ignoreboth:erasedups
7  history
Run Code Online (Sandbox Code Playgroud)

它将变成:

$ history
1  cmd2
2  cmd3
3  cmd2
4  export HISTCONTROL=ignoreboth:erasedups
5  cmd1
6  history
Run Code Online (Sandbox Code Playgroud)

所有 cmd1 命令(附加的命令除外)都将被删除。

如果cmd2执行,所有重复的cmd2也将被删除(也history):

$ cmd2
$ history
1  cmd3
2  export HISTCONTROL=ignoreboth:erasedups
3  cmd1
4  cmd2
5  history
Run Code Online (Sandbox Code Playgroud)

但即使现在,该文件也~/.bash_history没有被修改。它仍然包含上一个会话中的命令列表。对文件使用 grep 可能会显示许多重复项 (dups),包括刚刚使用的命令(cmd1 和 cmd2)。grep 只能在内存列表上正确工作:

$ history | grep cmd1
Run Code Online (Sandbox Code Playgroud)

一旦列表被写入文件(history -w),grep 只能找到会话中使用的每个命令行的一个实例,这是否正确。

您可以使用以下命令强制每次更新磁盘文件:

$ PROMPT_COMMAND='history -w'
Run Code Online (Sandbox Code Playgroud)


Wil*_*ard 3

根据man bash

ignoredups 值会导致不保存与先前历史记录条目匹配的行。

如果您somecommand在不带参数的情况下连续运行两次,您应该只能看到一个连续的条目。

同样,如果您连续运行somecommand 123两次,则只会将其添加到历史记录中一次。

列表中的命令显示没有连续的重复项,因此此功能按预期工作。

  • 我认为问题是关于“erasedups”而不是“ignoredups”(请阅读标题)。无论如何,您的回答并没有解释这样的选项 (4认同)