Por que o bash ainda mantém linhas duplicadas com apagamentos?

4

Eu tenho a seguinte linha no meu ~ / .bashrc

export HISTCONTROL=ignoreboth:erasedups

No entanto, sempre que eu executo somecommand , ele continua adicionando o comando duplicado em .bash_history como este

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

Por que isso e como evitá-lo?

    
por phuclv 18.10.2017 / 05:20

3 respostas

3

De acordo com man bash :

A value of ignoredups causes lines matching the previous history entry to not be saved.

Se você executar somecommand duas vezes seguidas sem argumentos, verá apenas uma entrada consecutiva .

Da mesma forma, se você executar somecommand 123 duas vezes seguidas, ele será adicionado somente ao histórico uma vez.

Os comandos da sua lista não exibem duplicatas consecutivas , portanto, esse recurso está funcionando como esperado.

    
por 18.10.2017 / 05:27
0

Para registrar todos os novos comandos é complicado. Primeiro você precisa adicionar ~/.profile ou similar:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Então você precisa adicionar a ~/.bash_logout :

history -a
history -w
    
por 04.02.2018 / 19:46
0

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'
    
por 01.07.2018 / 18:46