Comando para manter o histórico do bash limpo

Publicado por Iraziman da Silva Moura em 26/04/2011

[ Hits: 7.837 ]

 


Comando para manter o histórico do bash limpo



Esta dica serve pra quem costuma usar bastante o histórico do bash, mas detesta os comandos repetidos nele.

Garimpando a internet encontrei este comando que remove as linhas duplicadas sem alterar a ordem original do arquivo:

nl -n rz [file] | sort -k2 -u | sort | cut -f2-

Onde "file" é o nome do arquivo que se quer retirar as linhas duplicadas. Se for usada a variável de sistema do arquivo histórico do usuário. O comando fica assim:

nl -n rz $HISTFILE | sort -k2 -u | sort | cut -f2-

Se você quiser verificar como o comando funciona passo a passo:

nl -n rz $HISTFILE
$ nl -n rz $HISTFILE | sort -k2 -u
$ nl -n rz $HISTFILE | sort -k2 -u | sort
$ nl -n rz $HISTFILE | sort -k2 -u | sort | cut -f2-


Acrescentei alguns comandos para que conseguisse salvar a saída do comando acima no histórico do usuário. Ele ficou assim:

TMPFILE=`mktemp ./temp.XXX` && nl -n rz $HISTFILE | sort -k2 -u | sort | cut -f2- >> $TMPFILE && mv $TMPFILE $HISTFILE

Tentei melhorar a ideia acima criando um aliás, mas não consegui. Se alguém conseguir coloca nos comentários.

O que consegui foi criar uma função no ~/bashrc do usuário. Assim:

function limpar_bash()
{
TMPFILE=`mktemp ./temp.XXX`&&
nl -n rz $HISTFILE | sort -k2 -u | sort | cut -f2- >> $TMPFILE&&
mv $TMPFILE $HISTFILE
}

Após criada a função é só digitar "limpar_bash" no terminal do usuário e pronto.

Funciona perfeitamente em Debian e derivados.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Desabilitando o beep do console

Checando ocupação de disco dos diretórios a partir da raiz

Releitura do arquivo "/etc/fstab" sem reiniciar a máquina

Listando arquivos que contém determinado padrão recursivamente dentro de um diretório

Testar o funcionamento do serviço DHCP

  

Comentários
[1] Comentário enviado por removido em 26/04/2011 - 22:30h

gostei!

sem mais delongas... acrescentei a parte do bash_rc e rodei limpar_bash e de fato funciona, claro que fiz uma cópia antes hehehehe

favoritado!

[]'s

[2] Comentário enviado por SMarcell em 27/04/2011 - 00:40h

Complementando...

Adicionando isso:

export HISTCONTROL=ignoreboth

ao '~/.bashrc' ou '/etc/profile', o bash não manterá entradas duplicadas no histórico.

[3] Comentário enviado por selvaking em 18/06/2011 - 11:16h

Tá na página 14 do manual do BASH.

"HISTCONTROL
A colon-separated list of values controlling how commands are saved on the history list. If the list
of values includes ignorespace, lines which begin with a space character are not saved in the his-
tory list. A value of ignoredups causes lines matching the previous history entry to not be saved.
A value of ignoreboth is shorthand for ignorespace and ignoredups. A value of erasedups causes
all previous lines matching the current line to be removed from the history list before that line is
saved. Any value not in the above list is ignored. If HISTCONTROL is unset, or does not include
a valid value, all lines read by the shell parser are saved on the history list, subject to the value of
HISTIGNORE. The second and subsequent lines of a multi-line compound command are not
tested, and are added to the history regardless of the value of HISTCONTROL."

ignoreboth - é uma abreviação para ignorespace e ignoredups.
ignorespace - Se a linha inicia com um caracter de "espaço" não é salva no histórico.
ignoredups - Se a linha for igual a linha anterior não será salva no histórico.

Olhe este exemplo:
Abra o terminal e digite isto:
cd ~
ls -lhF
clear
cat .bashrc
echo $HISTCONTROL
echo $HISTCONTROL
echo $HISTCONTROL
tail .bash_history
exit

Abra novamente o terminal e digite isto:
tail .bash_history
echo $HISTCONTROL
echo $HISTCONTROL
exit

Como ficou o seu histórico? Apareceu linhas repetidas?
Claro que apareceu. É pra isto que serve este script!
E olha que estou usando no .bashrc o argumento HISTCONTROL=ignoredups:ignorespace:erasedups
O meu ficou assim:
cd ~
ls -lhF
clear
cat .bashrc
echo $HISTCONTROL
tail .bash_history
exit
tail .bash_history
echo $HISTCONTROL
exit



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts