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.
Índice
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 history
comando 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 history
comando elimina esses problemas. Como a maioria dos comandos do Linux, há mais do que você imagina . No entanto, se você aprender a usar o history
comando, 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 history
comando apenas digitando seu nome:
história
A lista de comandos usados anteriormente é então gravada na janela do 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 history
na linha de comando. Por exemplo, para ver os últimos 10 comandos que você usou, digite o seguinte:
história 10
Você pode obter o mesmo resultado se canalizar history
o tail
comando . Para fazer isso, digite o seguinte:
história | cauda -n 10
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
Para repetir o último comando, digite dois pontos de exclamação, novamente, sem espaços:
!!
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 !!
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
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
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 :p
modificador (imprimir), conforme mostrado abaixo:
! sudo: p
Isso instrui history
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:
!?apelido
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.
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.
Cada vez que você pressiona Ctrl + r, está pesquisando para trás pelo próximo comando correspondente, que aparece na janela do terminal.
Quando você pressiona Enter, o comando exibido será executado.
Para editar um comando antes de executá-lo, pressione a tecla de seta esquerda ou direita.
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 de history
em grep
e procurar comandos que contêm a string “aliases” você poderia usar este comando:
história | grep aliases
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 ^
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 -d
opção (excluir). Não há razão para manter o comando incorreto na lista de histórico.
Você pode usar grep
para encontrá-lo, passar seu número para history
com a -d
opçã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
Você também pode passar uma variedade de comandos para a -d
opçã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.
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 -a
opçã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
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 -w
opção (gravar), assim:
história -w
Limpando a lista de histórico
Para limpar todos os comandos da lista de histórico, você pode usar a -c
opção (limpar), da seguinte maneira:
história -c
Se você também deseja forçar essas alterações no arquivo de histórico, use a -w
opçã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
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
-d
opção (excluir) dehistory
. 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. Ohistory 1
comando retorna o comando anterior. Portanto, você pode pensar no segundo comando como histórico -d “último comando aqui”.
Você pode usar o history 5
comando 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
O comando com a senha não é adicionado à lista de histórico. O motivo pelo qual esse truque funciona está contido no .bashrc
arquivo.
O arquivo .bashrc
O .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 history
comando. Vamos editar este arquivo com gedit
.
Digite o seguinte:
gedit .bashrc
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.
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_history
arquivo. - 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
histappend
opção shell estiver habilitada, os comandos serão anexados a.bash_history
. Sehistappend
não estiver definido,.bash_history
será sobrescrito. - Após salvar os comandos da lista de histórico para
.bash_history
, o arquivo de histórico é truncado para conter no máximoHISTFILESIZE
linhas.
Também próximo ao início do arquivo, você verá uma entrada para o HISTCONTROL
valor.
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 .bashrc
arquivo e substituir os comandos que deseja ignorar:
export HISTIGNORE = "ls: histórico"
Usando carimbos de data / hora
Se você deseja adicionar carimbos de data / hora à lista de histórico, pode usar a HISTIMEFORMAT
configuração. Para fazer isso, basta adicionar uma linha como a seguinte ao seu .bashrc
arquivo:
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.
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 %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"
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 para serem HISTIMEFORMAT
aplicadas 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 HISTTIMEFORMAT
diretiva simplesmente especifica o formato usado para renderizar esse número de segundos em um estilo legível por humanos, como:
exportar HISTTIMEFORMAT = "% T"
Nossa produção agora é mais gerenciável.
Você também pode usar o history
comando 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.