Dominando o Comando history no Linux
O comando history é uma das ferramentas mais úteis e subutilizadas no terminal Linux. Neste guia completo, vamos explorar desde o básico até técnicas avançadas de organização.
Introdução ao Comando history
O comando history é um registro cronológico de todos os comandos executados no terminal, armazenado no arquivo ~/.bash_history no seu diretório home.
Considerações Importantes:
O histórico é escrito quando o shell sai: Tenha em mente que os comandos são tipicamente escritos no ficheiro de histórico quando você fecha a sessão do terminal. Se o seu terminal travar ou você fechá-lo abruptamente, alguns dos comandos mais recentes podem não ser salvos.
Use o teu terminal para visualizar o histórico completo:
~$ history
Isso mostra uma lista numerada dos últimos comandos executados, normalmente configurado para armazenar entre 500-1000 entradas por padrão.
Utilidade do Comando history
- Reexecução rápida (onde n é o número do comando):
~$ !n
- Busca reversa: Ctrl+R para pesquisar comandos anteriores
- Documentação: Manter registro de soluções para problemas recorrentes
- Automação: Base para criação de scripts
- Auditoria: Verificação de comandos executados em sistemas compartilhados
Eliminando Comandos Duplicados
Quando o histórico fica poluído com entradas repetidas:
Visualizar histórico sem duplicados:
~$ awk '!a[$0]++' ~/.bash_history
Remover duplicados permanentemente:
~$ awk '!a[$0]++' ~/.bash_history > temp_history && mv temp_history ~/.bash_history
Configurações para Prevenir Duplicados
Adicione ao seu ~/.bashrc:
# Ignorar comandos duplicados e comandos com espaço no início
export HISTCONTROL=erasedups:ignorespace
# Tamanho do histórico, desde que HISTFILESIZE seja superior ou igual ao HISTSIZE.
export HISTSIZE=10000
export HISTFILESIZE=20000
# Configuração para evitar perda de histórico entre sessões
shopt -s histappend
Dica: Após modificar o .bashrc, execute source ~/.bashrc para aplicar as mudanças sem precisar reiniciar o terminal:
~$ source ~/.bashrc
Trabalhando com Históricos Separados
Históricos por Projeto
Para criar um histórico específico para um projeto:
# Definir arquivo de histórico customizado
export HISTFILE=~/.bash_history_projeto
Podemos também criar um ficheiro com o nome .bash_projeto
touch ~/.bash_projeto
Abra o ficheiro recém criado num editor da sua preferência e introduza as seguintes linhas de configuração, poderá alterar os valores consoante as suas necessidades:
# Define a variável de ambiente HISTFILE para usar o histórico personalizado
export HISTFILE="$HOME/.bash_history_projeto"
# Ignorar comandos duplicados (ignoredups) e comandos com espaço no inicio (ignorespace)
export HISTCONTROL=ignoreboth
# Tamanho do histórico na memória
export HISTSIZE=1000
# Número de entradas no .bash_history_projeto
export HISTFILESIZE=1500
Depois de editar, recarregue o .bash_projeto:
source ~/.bash_projeto
A partir de agora todas as vezes que precisares alternar para este novo histórico é só recarregar o .bash_projeto
Função para Alternar Entre Históricos
Crie uma função com o nome: ~switch_history no final do ficheiro ~/.bashrc
# Força atualização contínua do histórico export PROMPT_COMMAND='history -a; history -n' # Função para alternar ficheiros de histórico switch_history() { if [ -z "$1" ]; then echo "Uso: switch_history [projeto|padrão]" return 1 fi if [ "$1" == "padrão" ]; then export HISTFILE="$HOME/.bash_history" echo "Histórico definido para o padrão (~/.bash_history)" else export HISTFILE="$HOME/.bash_history_$1" echo "Histórico definido para ~/.bash_history_$1" fi # Recarregar histórico para a sessão atual history -c # Limpa o histórico atual em memória history -r # Recarrega do novo $HISTFILE }
Depois de editar, não te esqueças de recarregar o .bashrc:
source ~/.bashrc
Aliases para trabalhar com histórico alternativo usando a função switch_history
Agora é só criar umas aliases para facilitar a tarefa de alternar entre os ficheiros onde history de comandos será registado e também para facilitar o acesso ao history de cada um desses ficheiros: .bash_history_projeto1 e .bash_history_projeto2. Deste modo, history relativo ao projeto1 e projeto2 poderá ser visualizado independentemente do diretório onde te encontras.
Este post sobre alias poderá ser de alguma utilidade: Aliases no Linux: Domine a Linha de Comando com Praticidade e Eficiência
# Aliases para trabalhar com histórico alternativo # Regista history no ficheiro .bash_history_projeto1 alias proj1="switch_history projeto1" # Regista history no ficheiro .bash_history_projeto2 alias proj2="switch_history projeto2" #Apresenta history no ficheiro .bash_history_projeto1 alias hist1="switch_history projeto1; history" #Apresenta history no ficheiro .bash_history_projeto2 alias hist2="switch_history projeto2; history"
Doravante para mudar para o ficheiro .bash_history_projeto1 é só digitar no terminal e dar Enter:
proj1
O mesmo procedimento para o ficheiro .bash_history_projeto2:
proj2
Para ver histórico nesses ficheiros de histórico alternativos também usamos os aliases correspondentes para .bash_history_projeto1 e .bash_history_projeto2:
hist1
hist2
Histórico Baseado no Diretório - Mudança automática de ficheiro de histórico
Com isto, todas as vezes que você usar o comando cd para entrar no diretório projeto1 ou projeto2 o ficheiro onde será registado o histórico mudará em conformidade com o número do projeto ou seja: .bash_history_projeto1 ou .bash_history_projeto2.
Adicione ao ~/.bashrc para mudança automática:
cd() { builtin cd "$@" || return if [[ $PWD == "$HOME/Development/projeto1"* ]]; then export HISTFILE="$HOME/.bash_history_projeto1" elif [[ $PWD == "$HOME/Development/projeto2"* ]]; then export HISTFILE="$HOME/.bash_history_projeto2" else export "HISTFILE=~/.bash_history" fi }
O ficheiro .bashrc com as funções e aliases
# Força atualização contínua do histórico export PROMPT_COMMAND='history -a; history -n' # Função para alternar ficheiros de histórico switch_history() { if [ -z "$1" ]; then echo "Uso: switch_history [projeto|padrão]" return 1 fi if [ "$1" == "padrão" ]; then export HISTFILE="$HOME/.bash_history" echo "Histórico definido para o padrão (~/.bash_history)" else export HISTFILE="$HOME/.bash_history_$1" echo "Histórico definido para ~/.bash_history_$1" fi # Recarregar histórico para a sessão atual history -c # Limpa o histórico atual em memória history -r # Recarrega do novo $HISTFILE } cd() { builtin cd "$@" || return if [[ $PWD == "$HOME/Development/projeto1"* ]]; then export HISTFILE="$HOME/.bash_history_projeto1" elif [[ $PWD == "$HOME/Development/projeto2"* ]]; then export HISTFILE="$HOME/.bash_history_projeto2" else export "HISTFILE=~/.bash_history" fi } # Aliases para trabalhar com histórico alternativo # Regista history no ficheiro .bash_history_projeto1 alias proj1="switch_history projeto1" # Regista history no ficheiro .bash_history_projeto2 alias proj2="switch_history projeto2" #Apresenta history no ficheiro .bash_history_projeto1 alias hist1="switch_history projeto1; history" #Apresenta history no ficheiro .bash_history_projeto2 alias hist2="switch_history projeto2; history"
Algumas Sugestões
- Backup periódico:
~$ cp ~/.bash_history ~/.bash_history_backup_$(date +%F)
- Limpeza seletiva para remover entradas específicas:
history -d número_do_comando
Conclusão
O comando history, quando bem configurado e organizado, se transforma em uma poderosa ferramenta de produtividade. Com as técnicas apresentadas:
- Você evita a poluição do histórico com duplicados
- Pode manter contextos separados para diferentes projetos
- Recupera comandos importantes com facilidade
- Transforma seu histórico em um repositório de conhecimento
Experimente implementar essas configurações e observe como sua eficiência no terminal melhora significativamente!
Comentários
Enviar um comentário