Dominando o Comando history no Linux

Imagem principal. Apresenta linhas de histórico em estilo lolcat, com múltiplas cores e áreas desfocadas.

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

Principais usos:
  • 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:

  1. Você evita a poluição do histórico com duplicados
  2. Pode manter contextos separados para diferentes projetos
  3. Recupera comandos importantes com facilidade
  4. 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

Mensagens populares deste blogue

Como Instalar o Fedora Linux 42: do Download à Configuração

Fedora 42: As Novidades da Nova Versão do Fedora Linux