Como evitar entradas duplicadas em .bash_history


108

O mesmo comando está listado no meu histórico repetidamente. Como posso evitar isso? Eu sei que é possível via, HISTCONTROLmas não encontrei o caminho certo.


Eu criei uma pergunta relacionada: askubuntu.com/questions/205520/… . Dups na história são úteis para ver o contexto de um comando. Às vezes, o que você deseja omitir dups quando imprime o histórico.
justingordon

Respostas:


123

Na bashpágina do manual:

HISTCONTROL

Uma lista de valores separados por dois pontos que controla como os comandos são salvos na lista de histórico. Se a lista de valores incluir ignorespace, as linhas que começam com um caractere de espaço não são salvas na lista de histórico. Um valor de ignoredupsfaz com que as linhas correspondentes à entrada do histórico anterior não sejam salvas. Um valor de ignorebothé uma abreviação de ignorespace e ignoredups. Um valor deerasedupsfaz com que todas as linhas anteriores correspondentes à linha atual sejam removidas da lista de histórico antes que a linha seja salva. Qualquer valor que não esteja na lista acima é ignorado. Se HISTCONTROL estiver desabilitado ou não incluir um valor válido, todas as linhas lidas pelo analisador de shell serão salvas na lista de histórico, sujeitas ao valor de HISTIGNORE. A segunda linha e as linhas subsequentes de um comando composto de várias linhas não são testadas e são adicionadas ao histórico, independentemente do valor de HISTCONTROL.

Então coloque a seguinte linha no seu ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


Deseja que eu adicione HISTCONTROL = ignoreboth na parte inferior de ~ / .bashrc?
precisa saber é o seguinte

11
@karthick Não importa onde você o coloca, o fundo é bom.
Isaiah

Na minha instalação do Ubuntu 12.04 Eu tive que fazer esta modificação na ~/.bash_loginmaior parte do tempo ele iria trabalhar se .bashrc é modificado, mas que não é o caso todo o tempo.
usar o seguinte

3
Não se esqueça de executar estes depois que você atualizar seus bash / arquivos rc perfil -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

Cole isso no seu ~/.bashrc:

export HISTCONTROL=ignoredups

Você poderia usar ignoreboth. Isso é uma abreviação para ambos ignorespaces(comandos começando com espaços) e ignoredups(duplicatas).

Eu prefiro ignoredupspor conta própria, pois acho o comportamento padrão de ignorar comandos com espaços na frente bastante irritante quando copio um comando de um site e ele não é salvo porque eu acidentalmente copiei um espaço também ... Mas para cada um deles.


3
Ainda existem duplicatas .. Qual pode ser o problema? imgur.com/fXeLQ.png
karthick87

5
@ karthick87 citado em outra resposta: Um valor que ignoredupsfaz com que as linhas correspondentes à entrada do histórico anterior não sejam salvas . Ele remove apenas linhas idênticas consecutivas.
AL

10

Colocá-lo ~/.bashrcaplicará a solução da @ alvin em diferentes sessões como wlell

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

Fonte: Linux: Histórico do Bash: "ignoredups" e "apagados", configurando conflito com o histórico comum nas sessões


Por que o uso dele export HISTCONTROLe o seu não? Qual é a diferença? É trabalhar para mim sem exportação, estou apenas curioso
felwithe

11
Boa pergunta! Eu também gostaria de saber a resposta. Em geral, exportfaz com que a variável disponível para sub-processos. stackoverflow.com/q/1158091/552621 No caso de HISTCONTROL, PROMPT_COMMANDetc, essas variáveis ​​são usadas pelo próprio shell; portanto, talvez não seja necessário exportá-las (para processos filhos).
Nour Wolf


3

Adicione o seguinte ao seu ~/.bashrc:

export HISTCONTROL=ignoredups

Para fazer isso, você pode usar este comando:

nano ~/.bashrc

0

Registrar uniqely todos os novos comandos é complicado. Primeiro você precisa adicionar ~/.profileou semelhante:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

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

history -a
history -w
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.