Como usar o comando de histórico no Linux

Um prompt de terminal em um laptop Linux.
Fatmawati Achmad Zaenuri / Shutterstock

O shell do Linux salva um histórico dos comandos que você executa e você pode pesquisá-lo para repetir comandos executados anteriormente. Depois de entender o comando de histórico do Linux e como usá-lo, ele pode aumentar significativamente sua produtividade.

Manipulando a História

Como George Santayana disse , “aqueles que não conseguem se lembrar do passado estão condenados a repeti-lo”. Infelizmente, no Linux, se você não consegue se lembrar do passado, não pode repeti-lo, mesmo que queira.

É quando o historycomando do Linux se torna útil. Ele permite que você reveja e repita seus comandos anteriores. Isso não visa apenas encorajar a preguiça ou economizar tempo – há também um fator de eficiência (e precisão) em jogo. Quanto mais longo e complicado for um comando, mais difícil será para lembrar e digitar sem cometer um erro. Existem dois tipos de erros: um que impede o comando de funcionar e outro que permite que o comando funcione, mas o faz fazer algo inesperado.

historycomando elimina esses problemas. Como a maioria dos comandos do Linux, há mais do que você imagina . No entanto, se você aprender a usar o historycomando, ele pode melhorar o uso da linha de comando do Linux a cada dia. É um bom investimento de seu tempo. Existem maneiras muito melhores de usar o history comando do que apenas  apertar a seta para cima repetidamente .

A história Comando

Em sua forma mais simples, você pode usar o historycomando apenas digitando seu nome:

história

O comando "histórico" em uma janela de terminal.

A lista de comandos usados ​​anteriormente é então gravada na janela do terminal.

Um exemplo de saída do comando "histórico" em uma janela de terminal.

Os comandos são numerados, com os usados ​​mais recentemente (aqueles com os números mais altos) no final da lista.

Para ver um certo número de comandos, você pode passar um número para historyna linha de comando. Por exemplo, para ver os últimos 10 comandos que você usou, digite o seguinte:

história 10

O comando "history 10" em uma janela de terminal.

Você pode obter o mesmo resultado se canalizar history o tailcomando . Para fazer isso, digite o seguinte:

história | cauda -n 10

O comando "history | tail -n 10" em uma janela de terminal.

Comandos de repetição

Se você quiser reutilizar um comando da lista de histórico, digite um ponto de exclamação (!) E o número do comando sem espaços entre eles.

Por exemplo, para repetir o comando número 37, você digitaria este comando:

37

Um comando "! 37" em uma janela de terminal.

Para repetir o último comando, digite dois pontos de exclamação, novamente, sem espaços:

!!

A "!!"  comando em uma janela de terminal.

Isso pode ser útil quando você emite um comando e se esquece de usar sudo. Digite sudo, um espaço, os pontos de exclamação duplos e pressione Enter.

Para o exemplo a seguir, digitamos um comando que requer sudo. Em vez de redigitar a linha inteira, podemos salvar várias combinações de teclas e apenas digitar  sudo !!, conforme mostrado abaixo:

mv ./my_script.sh / usr / local / bin /
sudo !!

Um comando "mv ./my_script.sh / usr / local / bin /" em uma janela de terminal.

Assim, você pode digitar o número correspondente da lista para repetir um comando ou usar os pontos de exclamação duplos para repetir o último comando usado. No entanto, e se você quiser repetir o quinto ou o oitavo comando?

Você pode usar um ponto de exclamação, um hífen (-) e o número de qualquer comando anterior (novamente, sem espaços) para repeti-lo.

Recomendado:  Como liberar espaço no seu PlayStation 4

Para repetir o 13º comando anterior, você digitaria o seguinte:

! -13

Um comando "! -13" em uma janela de terminal.

Pesquisando Comandos por String

Para repetir o último comando que começa com uma determinada string, você pode digitar um ponto de exclamação e, em seguida, a string sem espaços e, em seguida, pressionar Enter.

Por exemplo, para repetir o último comando que começou com sudo, você digitaria este comando:

! sudo

Um comando "! Sudo" em uma janela de terminal.

No entanto, há um elemento de perigo nisso. Se o último comando iniciado sudo não for o que você pensa que é, você executará o comando errado.

Para fornecer uma rede de segurança, no entanto, você pode usar o :pmodificador (imprimir), conforme mostrado abaixo:

! sudo: p

Um comando "! Sudo: p" em uma janela de terminal.

Isso instrui historya imprimir o comando na janela do terminal, em vez de executá-lo. Isso permite que você veja o comando antes de usá-lo. Se for o comando que você deseja, pressione a seta para cima e pressione Enter para usá-lo.

Se quiser encontrar um comando que contenha uma string específica, você pode usar um ponto de exclamação e um ponto de interrogação.

Por exemplo, para encontrar e executar o primeiro comando correspondente que contém a palavra “aliases”, você digitaria este comando:

!?apelido

Um comando "!? Aliases" em uma janela de terminal.

Isso encontrará qualquer comando que contenha a string “aliases”, independentemente de onde ele apareça na string.

Pesquisa Interativa

Uma pesquisa interativa permite que você passe por uma lista de comandos correspondentes e repita o que deseja.

Basta pressionar Ctrl + r para iniciar a pesquisa.

Uma janela de terminal após "Ctrl + r" ser pressionada.

Conforme você digita a pista de busca, o primeiro comando correspondente aparecerá. As letras digitadas aparecem entre o crase (`) e o apóstrofo (‘). Os comandos correspondentes são atualizados conforme você digita cada letra.

Uma pesquisa "Ctrl + r" com "sudo" digitado como a pista de pesquisa.

Cada vez que você pressiona Ctrl + r, está pesquisando para trás pelo próximo comando correspondente, que aparece na janela do terminal.

Uma pesquisa "Ctrl + r" mostrando um comando correspondente em uma janela de terminal.

Quando você pressiona Enter, o comando exibido será executado.

O comando "gedit" em uma janela de terminal iniciado a partir de um comando de pesquisa "Ctrl + r".

Para editar um comando antes de executá-lo, pressione a tecla de seta esquerda ou direita.

Uma pesquisa "Ctrl + r" em uma janela de terminal.

O comando aparece na linha de comando e você pode editá-lo.

Um comando na linha de comando com edição habilitada.

Você pode usar outras ferramentas do Linux para pesquisar a lista de histórico. Por exemplo, para canalizar a saída de historyem grep e procurar comandos que contêm a string “aliases” você poderia usar este comando:

história | grep aliases

O comando "history | grep aliases" em uma janela de terminal.

Modificando o Último Comando

Se você precisar corrigir um erro de digitação e repetir o comando, poderá usar o circunflexo (^) para modificá-lo. Esse é um ótimo truque para ter na manga, sempre que você digitar um comando incorretamente ou quiser executá-lo novamente com uma opção ou parâmetro de linha de comando diferente.

Para usá-lo, digite (sem espaços) um acento circunflexo, o texto que deseja substituir, outro acento circunflexo, o texto pelo qual deseja substituí-lo, outro acento circunflexo e pressione Enter.

Por exemplo, suponha que você digite o seguinte comando, digitando acidentalmente “shhd” em vez de “sshd”:

sudo systemctl start shhd

Você pode corrigir isso facilmente digitando o seguinte:

^ shhd ^ sshd ^

Um comando "sudo systemctl start shhd" em uma janela de terminal.

O comando é executado com “shhd” corrigido para “sshd”.

Excluindo Comandos da Lista de Histórico

Você também pode excluir comandos da lista de histórico com a -dopção (excluir). Não há razão para manter o comando incorreto na lista de histórico.

Você pode usar greppara encontrá-lo, passar seu número para historycom a -dopção de excluí-lo e pesquisar novamente para verificar se ele foi removido:

história | grep shhd
história -d 83
história | grep shhd

O comando "history | grep shhd" em uma janela de terminal.

Você também pode passar uma variedade de comandos para a -dopção. Para excluir todas as entradas da lista de 22 a 32 (inclusive), digite este comando:

história -d 22 32

Para excluir apenas os últimos cinco comandos, você pode digitar um número negativo, assim:

história -d -5

Atualização manual do arquivo de histórico

Quando você efetua login ou abre uma sessão de terminal, a lista de histórico é lida do arquivo de histórico. No Bash, o arquivo de histórico padrão é .bash_history.

Quaisquer alterações feitas na sessão atual da janela do terminal são gravadas no arquivo de histórico apenas quando você fecha a janela do terminal ou faz logout.

Recomendado:  12 regras de etiqueta de e-mail para comunicações perfeitas

Suponha que você queira abrir outra janela de terminal para acessar a lista de histórico completa, incluindo comandos que você digitou na primeira janela de terminal. A -aopção (tudo) permite que você faça isso na primeira janela do terminal antes de abrir a segunda.

Para usá-lo, digite o seguinte:

história -a

O comando "history -a" em uma janela de terminal.

Os comandos são gravados silenciosamente no arquivo de histórico.

Se você quiser gravar todas as alterações na lista de histórico no arquivo de histórico (se você excluiu alguns comandos antigos, por exemplo), você pode usar a -wopção (gravar), assim:

história -w

O comando "history -w" em uma janela de terminal.

Limpando a lista de histórico

Para limpar todos os comandos da lista de histórico, você pode usar a -copção (limpar), da seguinte maneira:

história -c

histórico -c em uma janela de terminal

Se você também deseja forçar essas alterações no arquivo de histórico, use a -wopção da seguinte maneira:

história -w

Segurança e Arquivo Histórico

Se você usar qualquer aplicativo que exija a digitação de informações confidenciais (como senhas) na linha de comando, lembre-se de que isso também será salvo no arquivo de histórico. Se não quiser que certas informações sejam salvas, você pode usar a seguinte estrutura de comando para excluí-las da lista de histórico imediatamente:

special-app my-secret-password; histórico -d $ (histórico 1)
história 5

Um comando "special-app my-secret-password; history -d $ (history 1)" em uma janela de terminal.

Essa estrutura inclui dois comandos separados por ponto e vírgula (;). Vamos decompô-lo:

  • app-especial : O nome do programa que estamos usando.
  • my-secret-password : a senha secreta que precisamos fornecer para o aplicativo na linha de comando. Este é o fim do comando um.
  • histórico -d : No comando dois, invocamos a -dopção (excluir) de history. O que vamos deletar está na próxima parte do comando.
  • $ (histórico 1) : Este usa uma substituição de comando. A parte do comando contido no  $() é executada em um subshell. O resultado dessa execução é postado como texto no comando original. O history 1comando retorna o comando anterior. Portanto, você pode pensar no segundo comando como histórico -d “último comando aqui”.

Você pode usar o history 5comando para certificar-se de que o comando que contém a senha foi removido da lista de histórico.

No entanto, há uma maneira ainda mais simples de fazer isso. Como o Bash ignora linhas que começam com um espaço por padrão, apenas inclua um espaço no início da linha, da seguinte maneira:

 outra-senha de aplicativo especial
história 5

Um comando de "outra senha de aplicativo especial" em uma janela de terminal.

O comando com a senha não é adicionado à lista de histórico. O motivo pelo qual esse truque funciona está contido no .bashrcarquivo.

O arquivo .bashrc

.bashrc arquivo é executado sempre que você efetua login ou abre uma janela de terminal. Ele também contém alguns valores que controlam o comportamento do historycomando. Vamos editar este arquivo com gedit .

Digite o seguinte:

gedit .bashrc

O comando "gedit .bashrc" em uma janela de terminal.

Perto do topo do arquivo, você vê duas entradas:

  • HISTSIZE:  O número máximo de entradas que a lista de histórico pode conter.
  • HISTFILESIZE:  O limite para o número de linhas que um arquivo de histórico pode conter.
Recomendado:  PSA: você pode codificar por cores seus arquivos do Mac com tags

".bashrc" no editor gedit.

Esses dois valores interagem das seguintes maneiras:

  • Quando você efetua login ou inicia uma sessão de janela de terminal, a lista de histórico é preenchida a partir do .bash_historyarquivo.
  • Quando você fecha uma janela de terminal, o número máximo de comandos definidos HISTSIZE são salvos no .bash_history arquivo.
  • Se a histappendopção shell estiver habilitada, os comandos serão anexados a .bash_history. Se histappendnão estiver definido, .bash_historyserá sobrescrito.
  • Após salvar os comandos da lista de histórico para .bash_history, o arquivo de histórico é truncado para conter no máximo HISTFILESIZElinhas.

Também próximo ao início do arquivo, você verá uma entrada para o HISTCONTROLvalor.

A entrada "HISTCONTROL" no arquivo ".bashrc" no gedit.

Você pode definir esse valor para fazer o seguinte:

  • ignorespaces:As linhas que começam com um espaço não são adicionadas à lista de histórico.
  • ignoredups:Comandos duplicados não são adicionados ao arquivo de histórico.
  • ignoreboth:Ativa ambos os itens acima.

Você também pode listar comandos específicos que não deseja adicionar à sua lista de histórico. Separe-os com dois pontos (:) e coloque-os entre aspas (“…”).

Você seguiria esta estrutura para adicionar uma linha ao seu  .bashrcarquivo e substituir os comandos que deseja ignorar:

export HISTIGNORE = "ls: histórico"

Um comando "export HISTIGNORE =" ls: history "no gedit.

Usando carimbos de data / hora

Se você deseja adicionar carimbos de data / hora à lista de histórico, pode usar a HISTIMEFORMATconfiguração. Para fazer isso, basta adicionar uma linha como a seguinte ao seu .bashrcarquivo:

exportar HISTTIMEFORMAT = "% c"

Observe que há um espaço antes das aspas de fechamento. Isso evita que o carimbo de data / hora ultrapasse os comandos da lista de comandos.

Um comando "export HISTTIMEFORMAT ="% c "no gedit.

Agora, quando você executa o comando de histórico, você vê os carimbos de data e hora. Observe que todos os comandos que estavam na lista de histórico antes de você adicionar os carimbos de data / hora serão marcados com a data e hora do primeiro comando que receber um carimbo de data / hora. Neste exemplo mostrado abaixo, este era o comando 118.

Uma lista de histórico com carimbos de data / hora em uma janela de terminal.

Esse é um carimbo de data / hora muito prolixo. No entanto, você pode usar tokens %c para além  de refiná-lo. 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 (formato ano-mês-data)
  • %T: Tempo (formato hora: minutos: segundos)
  • %c: Data e hora completas (formatos dia-data-mês-ano e hora: minutos: segundos)

Vamos experimentar e usar alguns tokens diferentes:

exportar HISTTIMEFORMAT = "% dn% m% T"

O comando export HISTTIMEFORMAT = "% dn% m% T" no gedit.

A saída usa o dia, mês e hora.

Uma lista de histórico com carimbos de data / hora em uma janela de terminal.

Se removermos o dia e o mês, no entanto, ele apenas mostrará a hora.

Quaisquer alterações feitas para serem HISTIMEFORMATaplicadas a toda a lista de histórico. Isso é possível porque o tempo de cada comando é armazenado como o  número de segundos da época do Unix . A HISTTIMEFORMATdiretiva simplesmente especifica o formato usado para renderizar esse número de segundos em um estilo legível por humanos, como:

exportar HISTTIMEFORMAT = "% T"

O comando "export HISTTIMEFORMAT ="% T "no gedit.

Nossa produção agora é mais gerenciável.

Uma lista de histórico com carimbos de data / hora em uma janela de terminal.

Você também pode usar o historycomando para auditar. Às vezes, revisar os  comandos  usados ​​no passado pode ajudá-lo a identificar o que pode ter causado um problema.

Assim como você pode na vida, no Linux, você pode usar o  history comando para reviver os bons momentos e aprender com os maus.