O terminal do Linux armazena um registro dos comandos que você executou. Essa funcionalidade permite que você os consulte e repita, aumentando significativamente sua eficiência ao trabalhar com a linha de comando.
Dominando o Histórico de Comandos
Como diz o ditado, “Aqueles que não conseguem se lembrar do passado estão condenados a repeti-lo”. No contexto do Linux, se você não tem como revisitar suas ações anteriores, não poderá repeti-las, mesmo que seja necessário.
É nesse ponto que o comando ‘history’ do Linux se torna indispensável. Ele permite que você analise e execute novamente comandos passados, o que vai além de apenas economizar tempo. Existe um fator de eficiência e precisão envolvido. Comandos complexos são difíceis de lembrar e digitar corretamente sem erros. Esses erros podem tanto impedir o funcionamento do comando quanto fazer com que ele execute algo inesperado.
O comando ‘history’ soluciona esses problemas. Assim como a maioria dos comandos do Linux, ele possui mais detalhes do que aparenta. Aprender a usá-lo é um investimento valioso, pois aprimora seu uso diário da linha de comando. Existem formas muito mais eficientes de usar o histórico do que apenas pressionar a seta para cima repetidamente.
Utilizando o Comando ‘history’
Na sua forma mais simples, basta digitar ‘history’ no terminal:
history
Isso exibirá uma lista dos comandos executados anteriormente, ordenados por número. Os comandos mais recentes terão números mais altos e estarão no final da lista.
Para exibir um número específico de comandos, use ‘history’ seguido do número desejado. Por exemplo, para ver os últimos 10 comandos:
history 10
Você também pode usar o comando ‘tail’ para obter o mesmo resultado:
history | tail -n 10
Repetindo Comandos
Para executar novamente um comando da lista de histórico, use um ponto de exclamação (!) seguido pelo número do comando (sem espaços). Por exemplo, para repetir o comando número 37:
!37
Para executar o último comando, use dois pontos de exclamação (!!), também sem espaços:
!!
Isso é útil quando você se esquece de usar ‘sudo’ em um comando. Digite ‘sudo’, um espaço e ‘!!’ para executar o último comando com privilégios de administrador.
Por exemplo:
mv ./meu_script.sh /usr/local/bin/
sudo !!
Para repetir comandos anteriores ao último, use um ponto de exclamação, um hífen (-) e o número do comando (sem espaços). Para repetir o 13º comando anterior:
!-13
Buscando Comandos por Texto
Para repetir o último comando que começa com um texto específico, digite um ponto de exclamação seguido do texto (sem espaços). Por exemplo, para repetir o último comando que começa com ‘sudo’:
!sudo
Tenha cuidado ao usar este método, pois ele pode executar um comando inesperado. Para evitar surpresas, use o modificador ‘:p’ para imprimir o comando antes de executá-lo:
!sudo:p
Se este for o comando desejado, pressione a seta para cima e Enter para executá-lo.
Para encontrar e executar um comando que contenha um texto específico, use um ponto de exclamação e um ponto de interrogação. Para encontrar o primeiro comando que contém a palavra “aliases”:
!?aliases
Busca Interativa
A busca interativa permite navegar pelos comandos correspondentes e executar o desejado. Pressione Ctrl + r para iniciar a busca.
À medida que você digita, o primeiro comando correspondente aparecerá. Pressione Ctrl + r para exibir o próximo comando correspondente.
Pressione Enter para executar o comando exibido.
Para editar um comando antes de executá-lo, pressione a seta para a Esquerda ou Direita.
O comando aparecerá na linha de comando para que você possa modificá-lo.
Você pode usar outras ferramentas do Linux para pesquisar o histórico. Por exemplo, para encontrar comandos que contenham a palavra “aliases” com o ‘grep’:
history | grep aliases
Modificando o Último Comando
Use o acento circunflexo (^) para corrigir erros de digitação e repetir comandos. Digite (sem espaços) um acento circunflexo, o texto a ser substituído, outro acento circunflexo, o texto que o substituirá e outro acento circunflexo. Por exemplo:
sudo systemctl start shhd
Você pode corrigir facilmente ‘shhd’ para ‘sshd’ digitando:
^shhd^sshd^
Excluindo Comandos do Histórico
Use a opção ‘-d’ para excluir comandos do histórico. Exclua um comando com erro de digitação para mantê-lo limpo.
Por exemplo, use grep para encontrá-lo, e passe seu número para o histórico com a opção -d:
history | grep shhd
history -d 83
history | grep shhd
Você pode excluir uma sequência de comandos usando ‘-d’ seguido do primeiro e último número da sequência. Para excluir os comandos de 22 a 32 (inclusive):
history -d 22 32
Para excluir os últimos cinco comandos:
history -d -5
Atualização Manual do Arquivo de Histórico
O histórico é carregado de um arquivo quando você abre uma sessão. No Bash, o padrão é ‘.bash_history’. As alterações são salvas no arquivo quando você fecha o terminal ou faz logoff.
Use a opção ‘-a’ para salvar as alterações do histórico em um arquivo de histórico em uma sessão e disponibilizá-las para outras sessões antes de fechá-la. Para fazer isso, digite:
history -a
Para salvar todas as alterações (incluindo comandos excluídos) no arquivo de histórico, use a opção ‘-w’:
history -w
Limpando o Histórico
Para remover todos os comandos da lista de histórico, use a opção ‘-c’:
history -c
Para forçar a remoção também do arquivo de histórico, use a opção ‘-w’:
history -w
Segurança e o Arquivo de Histórico
Se você usar aplicativos que requerem informações confidenciais (como senhas) na linha de comando, elas serão salvas no histórico. Para evitar isso, você pode usar o seguinte método para excluir comandos do histórico imediatamente:
special-app minha-senha-secreta;history -d $(history 1)
history 5
Este comando consiste em duas partes, separadas por um ponto e vírgula (;):
- ‘special-app minha-senha-secreta’: O primeiro comando que executa o programa com a senha.
- ‘history -d $(history 1)’: O segundo comando, que usa ‘history -d’ para excluir o último comando, que contém a senha.
Você pode usar ‘history 5’ para verificar se o comando foi removido.
Um método ainda mais simples é adicionar um espaço no início da linha, pois o Bash ignora linhas que começam com um espaço. Por exemplo:
special-app outra-senha
history 5
Este comando não será salvo no histórico. Esse comportamento está definido no arquivo ‘.bashrc’.
O Arquivo ‘.bashrc’
O arquivo ‘.bashrc’ é executado sempre que você faz login ou abre uma janela de terminal. Ele contém configurações que controlam o comportamento do comando ‘history’. Edite este arquivo com o gedit:
gedit .bashrc
Na parte superior do arquivo, você verá:
- HISTSIZE: O número máximo de entradas na lista de histórico.
- HISTFILESIZE: O número máximo de linhas que o arquivo de histórico pode conter.
Esses valores interagem da seguinte forma:
- Ao fazer login ou abrir o terminal, o histórico é carregado do arquivo ‘.bash_history’.
- Ao fechar o terminal, até ‘HISTSIZE’ comandos são salvos em ‘.bash_history’.
- Se a opção ‘histappend’ estiver ativa, novos comandos são adicionados a ‘.bash_history’. Se não estiver ativa, ‘.bash_history’ é sobrescrito.
- Após salvar os comandos, o arquivo de histórico é reduzido para não ultrapassar o número de linhas definido por ‘HISTFILESIZE’.
Você também verá uma entrada para o valor ‘HISTCONTROL’:
Você pode definir esse valor para:
- ignorespaces: Linhas que começam com um espaço não são adicionadas ao histórico.
- ignoredups: Comandos duplicados não são adicionados ao histórico.
- ignoreboth: Ativa ambas as opções acima.
Você também pode listar comandos específicos para não serem adicionados ao histórico. Separe-os com dois pontos (:) e coloque-os entre aspas (“…”):
export HISTIGNORE="ls:history"
Usando Carimbos de Data/Hora
Para adicionar carimbos de data e hora à lista de histórico, use a configuração ‘HISTTIMEFORMAT’. Adicione uma linha como a seguinte ao arquivo ‘.bashrc’:
export HISTTIMEFORMAT="%c "
Agora, ao usar o comando ‘history’, você verá os carimbos de data e hora. Os comandos anteriores mostrarão a data e hora do primeiro comando que recebeu um carimbo.
Você pode usar outros tokens além de ‘%c’ para refinar o formato. Os outros tokens que você pode usar são:
- %d: dia
- %m: mês
- %y: ano
- %H: hora
- %M: minutos
- %S: segundos
- %F: Data completa (ano-mês-dia)
- %T: hora (hora:minutos:segundos)
- %c: Data e hora completas (dia-mês-ano e hora:minutos:segundos)
Experimente outros tokens:
export HISTTIMEFORMAT="%d %m %T "
A saída exibirá o dia, mês e hora.
Se removermos o dia e o mês, ele exibirá apenas a hora.
As mudanças em ‘HISTTIMEFORMAT’ afetam toda a lista de histórico. O tempo de cada comando é armazenado em segundos desde a Época Unix, e ‘HISTTIMEFORMAT’ especifica como esse número é apresentado. Por exemplo:
export HISTTIMEFORMAT="%T "
A saída ficará mais concisa.
O histórico também pode ser usado para auditoria, ajudando a identificar possíveis problemas ao revisar ações anteriores.
Assim como na vida, você pode usar o comando ‘history’ para reviver os bons momentos e aprender com os maus.