Como usar o comando de histórico no Linux

O shell do Linux salva um histórico dos comandos executados 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 a famosa frase, “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 se quiser.

É quando o comando de histórico 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.

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

A história Comando

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

history

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

Um exemplo de saída do

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 o histórico na linha de comando. Por exemplo, para ver os últimos 10 comandos que você usou, digite o seguinte:

history 10

O

Você pode obter o mesmo resultado se canalizar o histórico através do comando de cauda. Para fazer isso, digite o seguinte:

history | tail -n 10

O

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

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

!!

Um

Isso pode ser útil quando você emite um comando e se esquece de usar o 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

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.

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

!-13

Um

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 iniciado com sudo, você digitaria este comando:

!sudo

Um

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

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

!sudo:p

Um

Isso instrui o histórico a 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:

!?aliases

Um

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

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

Cada vez que você pressiona Ctrl + r, está procurando o próximo comando correspondente, que aparece na janela do terminal.

UMA

Ao pressionar Enter, o comando exibido será executado.

O

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

UMA

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

Você pode usar outras ferramentas do Linux para pesquisar a lista de histórico. Por exemplo, para canalizar a saída do histórico para grep e procure por comandos que contenham a string “Aliases” você pode usar este comando:

history | grep aliases

O

Modificando o Último Comando

Se você precisar corrigir um erro de digitação e repetir o comando, poderá usar o acento 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, acidentalmente digitando “shhd” em vez de “sshd”:

sudo systemctl start shhd

Você pode corrigir isso facilmente digitando o seguinte:

^shhd^sshd^

UMA

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 opção -d (excluir). Não há razão para manter o comando com erros ortográficos na lista de histórico.

Você pode usar o grep para encontrá-lo, passar seu número para o histórico com a opção -d para excluí-lo e, em seguida, pesquisar novamente para ter certeza de que ele foi removido:

history | grep shhd
history -d 83
history | grep shhd

O

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

history -d 22 32

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

history -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 a partir do arquivo de histórico. No Bash, o arquivo de histórico padrão é .bash_history.

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

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 opção -a (tudo) permite que você faça isso na primeira janela do terminal antes de abrir a segunda.

Para usá-lo, digite o seguinte:

history -a

O

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

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

history -w

O

Limpando a lista de histórico

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

history -c

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

history -w

Segurança e o arquivo de 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 você 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;history -d $(history 1)
history 5

UMA

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 opção -d (excluir) do histórico. 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 em $ () é executada em um subshell. O resultado dessa execução é postado como texto no comando original. O comando history 1 retorna o comando anterior. Portanto, você pode pensar no segundo comando como histórico -d “último comando aqui”.

Você pode usar o comando history 5 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:

 special-app another-password
history 5

UMA

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

O arquivo .bashrc

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

Digite o seguinte:

gedit .bashrc

O

Perto da parte superior 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.

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 arquivo .bash_history.
Quando você fecha uma janela de terminal, o número máximo de comandos definidos em HISTSIZE são salvos no arquivo .bash_history.
Se a opção histappend shell estiver habilitada, os comandos serão anexados a .bash_history. Se histappend não for definido, .bash_history será sobrescrito.
Depois de salvar os comandos da lista de histórico em .bash_history, o arquivo de histórico é truncado para conter não mais do que linhas HISTFILESIZE.

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

O

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.
Ignorados: 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 arquivo .bashrc e substituir os comandos que deseja ignorar:

export HISTIGNORE="ls:history"

Um

Usando carimbos de data / hora

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

export HISTTIMEFORMAT="%c "

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

Um

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.

Esse é um carimbo de data / hora muito prolixo. No entanto, você pode usar tokens diferentes de% c para 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: hora (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:

export HISTTIMEFORMAT="%d n%m %T "

A exportação HISTTIMEFORMAT =

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

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

Quaisquer alterações feitas em HISTIMEFORMAT se aplicam 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 Unix. A diretiva HISTTIMEFORMAT simplesmente especifica o formato usado para renderizar esse número de segundos em um estilo legível por humanos, como:

export HISTTIMEFORMAT="%T "

O

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

Você também pode usar o comando de histórico para auditar. Às vezes, revisar comandos que você usou 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 comando history para reviver os bons tempos e aprender com os maus.