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.
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