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

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

我的 ~/.bashrc 中有以下行

export HISTCONTROL=ignoreboth:erasedups

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

grep -w somecommand ~/.bash_history
somecommand
somecommand abc xyz
somecommand 123
somecommand
...

这是为什么以及如何预防呢?

答案1

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

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

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

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

$ history
1  cmd1
2  cmd2
3  cmd3
4  cmd1
5  cmd2
6  export HISTCONTROL=ignoreboth:erasedups
7  history

它将变成:

$ history
1  cmd2
2  cmd3
3  cmd2
4  export HISTCONTROL=ignoreboth:erasedups
5  cmd1
6  history

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

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

$ cmd2
$ history
1  cmd3
2  export HISTCONTROL=ignoreboth:erasedups
3  cmd1
4  cmd2
5  history

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

$ history | grep cmd1

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

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

$ PROMPT_COMMAND='history -w'

答案2

根据man bash

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

如果您somecommand在没有参数的情况下连续运行两次,您应该只看到一个连续的入口。

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

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

答案3

唯一地记录每个新命令是很棘手的。首先您需要添加 ~/.profile或类似:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

然后你需要添加~/.bash_logout

history -a
history -w

相关内容