The erasedups option will remove duplicated lines limited by this two conditions:
- The lines will be erased from the list in memory.
- Only when a new command is going to be added to the list.
The list in memory is the output of history.
The whole list "in memory" will be written to file with history -w or when bash is closed (if histappend is not set).
So, if the list in memory is:
$ history
1 cmd1
2 cmd2
3 cmd3
4 cmd1
5 cmd2
6 export HISTCONTROL=ignoreboth:erasedups
7 history
It will become:
$ history
1 cmd2
2 cmd3
3 cmd2
4 export HISTCONTROL=ignoreboth:erasedups
5 cmd1
6 history
All cmd1 commands (except the one being appended) are removed.
If cmd2 is executed, all repeats of cmd2 are also removed (also history):
$ cmd2
$ history
1 cmd3
2 export HISTCONTROL=ignoreboth:erasedups
3 cmd1
4 cmd2
5 history
But even now, the file ~/.bash_history has not been modified. It still contains the list of commands from a previous session. Using grep on the file may show many duplicates (dups), including the commands just used (cmd1 and cmd2). A grep will only work correctly on the memory list:
$ history | grep cmd1
Once the list gets written to file (history -w) is it correct that only one instance of each command line used in the session.will be found with grep.
You can force an update of the disk file every time with:
$ PROMPT_COMMAND='history -w'