Desativar itens repetidos no histórico bash

1

Bash no Fedora 19 é realmente irritante para mim. Digamos que eu execute um comando:

echo "Hello"

Então eu corro outro comando:

echo "World"

Agora eu executo o último comando ( echo "World" ) novamente N vezes pressionando up no meu teclado, seguido por enter. (Uso típico).

O problema é que cada um desses comandos echo "World" é inserido no histórico, mesmo sendo idênticos. Eu quero simplesmente pressionar up duas vezes e chegar a echo "Hello" . Em vez disso, devo pressionar up N + 1 vezes.

Por que isso está quebrado? Como faço para corrigir isso?

    
por Jonathon Reinhart 08.04.2014 / 14:20

4 respostas

3

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 03.02.2018 / 23:59
1

Eu não sei como consertar esse problema, mas vou te dar uma alternativa muito melhor. Faça isso com "Ctrl + r echo" e faça uma iteração nas suas versões digitadas com "Ctrl + r" É mais rápido e quando você conseguir o truque, você vai adorar.

Exemplo

Ctrl+r echo

the promt show: "echo World", if this is not what you want, push one more time Ctrl+r

the promt show: "echo hello", if this is not what you want, push Ctrl+r. If this is what you want, simply push Enter.

E você não precisa começar sua palavra em ordem, você pode fazer:

Ctrl+r World

and the prompt will show "echo World" and you can push Enter to execute it.

Tão fácil.

    
por 08.04.2014 / 14:35
1

Isso é 'quebrado' porque cada comando é inserido no histórico por padrão, como o @suspectus apontou.

Você pode, no entanto, instruir o Bash a apagar duplicatas definindo a variável de bash HISTCONTROL . (Documentação: link ). É uma lista separada por dois-pontos de zero ou mais palavras-chave, aquela com a qual você provavelmente está mais interessado em ser erasedups . Observe que apenas o histórico inserido nas sessões atuais é afetado. A configuração de HISTCONTROL=erasedups não voltará e apagará duplicatas de suas sessões anteriores (mas procure abaixo outra solução). Observe também que HISTCONTROL é uma variável de Bash e não precisa ser exportada.

Por que vale a pena, minhas configurações são:

HISTCONTROL=ignoreboth:erasedups
HISTIGNORE="?:??:???:$HISTIGNORE"
HISTSIZE=5000

Comecei a usar essas configurações porque fiquei incomodado com muitos comandos triviais e duplicados, empurrando comandos cuidadosamente criados 'para fora da lista'. A configuração HISTIGNORE ignora os comandos curtos. Eu acho que não é muito mais curto digitar 'Up Arrow' para recuperar um comando como ls , então prefiro não armazenar os comandos de uma a três letras. Além disso, qualquer coisa que comece com um espaço não será armazenada no histórico. Eu uso isso para comandos descartáveis.

Observe que as duplicatas ainda podem se acumular se você tiver várias sessões abertas ao mesmo tempo. De tempos em tempos, eu removo duplicatas do arquivo de histórico com o seguinte one-liner:

tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history
    
por 09.04.2014 / 09:57
0

O histórico de bash não consegue distinguir comandos duplicados. Todos os comandos são registrados no histórico. Uma maneira de chegar rapidamente ao comando necessário é:

set -o vi

digite ESC e, em seguida, /hello lhe dará o comando mais recente com a string "olá". Use a seta para cima para listar os comandos anteriores que correspondem à string "hello". Outros comandos do vi podem ser usados para recuperar / navegar pelos comandos.

Se for útil, set -o vi pode ser adicionado ao .bashrc no diretório HOME .

    
por 08.04.2014 / 15:20