Parte2 - Dicas de Shell - Comando history e seus segredos!
Autor: Badtux's Blog | Publicado: 2011-11-23T09:49:00-02:00

Continuando com a série de tutorias Dicas de Shell, vamos para a segunda parte das dicas de como consultar o histórico de comandos.
Primeiro, vamos analisar a saída do comando history abaixo:

teste@badtux-WS:~$ ls
teste@badtux-WS:~$ ls
teste@badtux-WS:~$ ls
teste@badtux-WS:~$ pwd
teste@badtux-WS:~$ pwd
teste@badtux-WS:~$ pwd

teste@badtux-WS:~$ history


&nbsp; &nbsp; 1 &nbsp;ls
&nbsp; &nbsp; 2 &nbsp;ls
&nbsp; &nbsp; 3 &nbsp;ls
&nbsp; &nbsp; 4 &nbsp;ls
&nbsp; &nbsp; 5 &nbsp;pwd
&nbsp; &nbsp; 6 &nbsp;pwd
&nbsp; &nbsp; 7 &nbsp;pwd
&nbsp; &nbsp; 8 &nbsp;history&nbsp;






Como sabemos, a saída do comando history mostra os últimos comandos digitados, inclusive os comandos digitados repetidamente como no exemplo acima. Podemos dizer ao history para não exibir os comandos que foram executados na sequência repetidamente, para isso, basta alterar o valor da&nbsp;variável&nbsp;$HISTCONTROL como mostramos abaixo:


teste@badtux-WS:~$ export HISTCONTROL=ignoredups

teste@badtux-WS:~$ ls
teste@badtux-WS:~$ ls
teste@badtux-WS:~$ ls
teste@badtux-WS:~$ pwd
teste@badtux-WS:~$ pwd
teste@badtux-WS:~$ pwd





teste@badtux-WS:~$ history&nbsp;

&nbsp; &nbsp; &nbsp;...
&nbsp; &nbsp; 9 &nbsp;export HISTCONTROL=ignoredups
&nbsp; &nbsp;10 &nbsp;history
&nbsp; &nbsp;11 &nbsp;ls
&nbsp; &nbsp;12 &nbsp;pwd
&nbsp; &nbsp;13 &nbsp;history
teste@badtux-WS:~$&nbsp;


Conforme notamos, agora a saída do comando history não exibirá comandos que foram executados&nbsp;repetidamente.



Outra dica interessante é dizer ao history para que ele ignore alguns comandos através da&nbsp;variável&nbsp;$HISTIGNORE, ou seja, ele não exibirá no&nbsp;histórico&nbsp;determinados comandos que você especificar.


teste@badtux-WS:~$ export HISTIGNORE="pwd:ls:uname"


Com isso, estamos dizendo ao history para ele não exibir os comandos pwd, ls e o uname. Veja abaixo:


teste@badtux-WS:~$ tail /etc/inittab
teste@badtux-WS:~$ echo "teste
teste@badtux-WS:~$ echo "teste"
teste@badtux-WS:~$ ls
teste@badtux-WS:~$ pwd
teste@badtux-WS:~$ crontab -l







teste@badtux-WS:~$ history&nbsp;

&nbsp; &nbsp; ...&nbsp; &nbsp;14 &nbsp;export HISTIGNORE="pwd:ls:uname"
&nbsp; &nbsp;15 &nbsp;tail /etc/inittab
&nbsp; &nbsp;16 &nbsp;echo "teste
&nbsp; &nbsp;17 &nbsp;echo "teste"
&nbsp; &nbsp;18 &nbsp;crontab -l
&nbsp; &nbsp;19 &nbsp;history
teste@jeferson-WS:~$&nbsp;




Repare que executei diversos comandos e a saída do history exibiu todos, exceto os comandos que pedi para que ignorasse, certo?



Agora vamos aprender como re-utilizar apenas um pedaço da ultima linha de comando executada. Como exemplo, vamos copiar um arquivo:

teste@badtux-WS:~$ cp /root/8139too.ko /lib/modules/2.6.32-5/kernel/drivers/net/

Vamos utilizar apenas um pedaço da linha acima, vamos imaginar que&nbsp;gostaríamos&nbsp;de executar um ls no&nbsp;diretório&nbsp;para onde eu copiei o arquivo, mas não queremos digitar novamente o caminho todo do&nbsp;diretório. Como faremos?&nbsp;



Simples, basta utilizar regex! ;)

teste@badtux-WS:~$ cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/


teste@badtux-WS:~$ ls !:$

ls /lib/modules/2.6.32-5-amd64/kernel/drivers/net/


Utilizando o !:$ podemos utilizar a parte final do ultimo comando digitado, pois o simbolo $ representa o final da linha, ou seja,&nbsp;o final da linha de comando no caso do&nbsp;histórico, como mostrado acima. Isso é bastante interessante, pois ajuda muito no dia-a-dia.



Caso eu queira aproveitar o inicio da linha eu devo utilizar o &nbsp;simbolo ^, conforme abaixo:



teste@badtux-WS:~$ cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/

teste@badtux-WS:~$ ls !:^

ls /root/8139too.ko

Lembrando apenas que dessa forma funciona apenas com o ultimo comando digitado, não sendo&nbsp;possível&nbsp;utilizar partes de outros comandos executados anteriormente.



Mas podemos utilizar outra forma para aproveitar partes de comandos executados anteriormente, porém utilizando outra sintaxe:


teste@badtux-WS:~$ cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/...

teste@badtux-WS:~$ ls !cp:2&nbsp;

ls /lib/modules/2.6.32-5-amd64/kernel/drivers/net/



O comando acima, irá pegar a segunda parte da ultima execução do comando cp. Vale lembrar que ele pega a ultima execução do cp e não o ultimo comando digitado.

Vamos ver o mesmo exemplo, porém utilizando a primeira parte da linha de comando:&nbsp;


teste@badtux-WS:~$ cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/

...

teste@badtux-WS:~$ ls !cp:1

ls /root/8139too.ko



Tranquilo? Espero que sim! ;)



Pode parecer um pouco complicado de entender, mas quando vocês começarem a realizar os primeiros testes, acredito que as duvidas irão desaparecer e o entendimento será tranquilo!



Existem outras formas de consultar o historico de comandos, essas formas são as mais conhecidas e estarei resumindo abaixo:



Executando novamente o ultimo comando:


teste@badtux-WS:~$ !!

ls /root/8139too.ko


Executando novamente a ultima linha de comando com o cp:


teste@badtux-WS:~$ !cp

cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/


Executando novamente um comando através do numero de identificação do history:


teste@badtux-WS:~$ history | tail&nbsp;

&nbsp; &nbsp;23 &nbsp;cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/
&nbsp; &nbsp;24 &nbsp;touoch /root/8139too.ko
&nbsp; &nbsp;25 &nbsp;touch /root/8139too.ko
&nbsp; &nbsp;26 &nbsp;cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/
&nbsp; &nbsp;27 &nbsp;ls /root/8139too.ko
&nbsp; &nbsp;28 &nbsp;cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/
&nbsp; &nbsp;29 &nbsp;ls /lib/modules/2.6.32-5-amd64/kernel/drivers/net/
&nbsp; &nbsp;30 &nbsp;ls /root/8139too.ko
&nbsp; &nbsp;31 &nbsp;cp /root/8139too.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/net/
&nbsp; &nbsp;32 &nbsp;history | tail&nbsp;


teste@badtux-WS:~$ !29

ls /lib/modules/2.6.32-5-amd64/kernel/drivers/net/

Existe ainda a possibilidade de fazer uma consulta interativa ao&nbsp;histórico&nbsp;de comandos através da combinação CTRL + r :

(reverse-i-search)`cp': cp /root/8139too.ko /lib/modules/2.6.32-5/kernel/drivers/net/

Assim, você começa a digitar o comando e o history vai completando de acordo com os comandos digitados anteriormente!!!

E para fechar:


teste@badtux-WS:~$ history -c

Com isso, pagamos nosso&nbsp;histórico&nbsp;de comandos! ;)


UPDATE
Podemos visualizar todas as variaveis reservadas do bash na seguinte URL do site oficial de documentação do Linux:

TLDP.ORG - Variaveis Reservadas do BASH



Assim terminamos a segunda parte, em breve continuaremos com a série: Dicas de Shell ;)



Aproveite para seguir o blog e divulgar à seus amigos!!!



Parte1 - Dicas de Shell - Comando history e seus segredos!