A opção erasedups
removerá linhas duplicadas limitadas por estas duas condições:
- As linhas serão apagadas da lista na memória .
- Apenas quando um novo comando for adicionado à lista.
A lista na memória é a saída de history
.
A lista inteira "in memory" será gravada no arquivo com history -w
ou quando o bash for fechado (se histappend não estiver definido).
Então, se a lista na memória for:
$ history
1 cmd1
2 cmd2
3 cmd3
4 cmd1
5 cmd2
6 export HISTCONTROL=ignoreboth:erasedups
7 history
Será:
$ history
1 cmd2
2 cmd3
3 cmd2
4 export HISTCONTROL=ignoreboth:erasedups
5 cmd1
6 history
Todos os comandos cmd1 (exceto o que está sendo anexado) são removidos.
Se cmd2
for executado, todas as repetições de cmd2
também serão removidas (também history
):
$ cmd2
$ history
1 cmd3
2 export HISTCONTROL=ignoreboth:erasedups
3 cmd1
4 cmd2
5 history
Mas, mesmo agora, o arquivo ~/.bash_history
não foi modificado. Ainda contém a lista de comandos de uma sessão anterior. Usar o grep no arquivo pode mostrar várias duplicatas (dups), incluindo os comandos que acabamos de usar (cmd1 e cmd2). Um grep só funcionará corretamente na lista de memória:
$ history | grep cmd1
Uma vez que a lista seja gravada no arquivo (history -w), é correto que apenas uma instância de cada linha de comando usada na sessão seja encontrada com grep.
Você pode forçar uma atualização do arquivo do disco toda vez com:
$ PROMPT_COMMAND='history -w'