Parte1 - Dicas de Shell - Comando history e seus segredos!
Autor: Badtux's Blog | Publicado: 2011-11-21T11:03:00-02:00

Olá Pessoal,

Estarei disponibilizando alguns artigos relacionados a dicas de Shell, esses artigos serão seriais e começaremos pelo comando history,&nbsp;porém a ideia é criar uma base com diversas dicas da utilização do Shell, principalmente do Bash, porém teremos algumas dicas sobre outros sabores como o KSH e CSH.

Como chute inicial dessa série, vamos falar sobre um comando que muitos utilizam, porém poucos o conhecem bem, o history.
Primeiramente, para que serve o history?

O history&nbsp;é utilizado para consultar seu&nbsp;histórico&nbsp;de comando executados, como podemos observar na saída abaixo:


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


&nbsp; &nbsp; 1 &nbsp;ls
&nbsp; &nbsp; 2 &nbsp;cd /home/
&nbsp; &nbsp; 3 &nbsp;ls
&nbsp; &nbsp; 4 &nbsp;cd -lha
&nbsp; &nbsp; 5 &nbsp;ls -lha
&nbsp; &nbsp; 6 &nbsp;cd teste/
&nbsp; &nbsp; 7 &nbsp;ls
&nbsp; &nbsp; 8 &nbsp;ls -lha
&nbsp; &nbsp; 9 &nbsp;pwd
&nbsp; &nbsp;10 &nbsp;date
&nbsp; &nbsp;11 &nbsp;cd ../../
&nbsp; &nbsp;12 &nbsp;ls
&nbsp; &nbsp;13 &nbsp;cd
&nbsp; &nbsp;14 &nbsp;history
teste@badtux-WS:~$&nbsp;
Por padrão, a saída do history reúne o histórico dos últimos 500 comandos executados, porém esse número pode ser facilmente modificado através da&nbsp;variável $HISTSIZE.

Visualizando o valor da&nbsp;variável:

teste@badtux-WS:~$ echo $HISTSIZE

500

Modificando o valor da&nbsp;variável&nbsp;para que a saída do history&nbsp;mostre apenas os últimos 5 comandos executados:

teste@badtux-WS:~$ export HISTSIZE=5

Agora teremos o histórico apenas dos&nbsp;últimos&nbsp;5 comandos executados:

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

&nbsp; &nbsp;12 &nbsp;cd
&nbsp; &nbsp;13 &nbsp;history
&nbsp; &nbsp;14 &nbsp;echo $HISTSIZE
&nbsp; &nbsp;15 &nbsp;export HISTSIZE=5
&nbsp; &nbsp;16 &nbsp;history
teste@badtux-WS:~$&nbsp;

O&nbsp;histórico&nbsp;de comandos é organizado por&nbsp;usuário, logo cada&nbsp;usuário&nbsp;tem seu&nbsp;histórico&nbsp;de comandos executados e dentro de cada&nbsp;diretório&nbsp;"home" de&nbsp;usuário, existe um arquivo chamado .bash_history&nbsp;que é o&nbsp;responsável&nbsp;por armazenar o&nbsp;histórico&nbsp;de comandos do&nbsp;usuário.

O .bash_history, por padrão, armazena os&nbsp;últimos&nbsp;500 comandos executados, e quem define esse numero é a&nbsp;variável&nbsp;$HISTFILESIZE.


teste@badtux-WS:~$ echo $HISTFILESIZE

500


Podemos alterar esse valor facilmente:

teste@badtux-WS:~$ export HISTFILESIZE=5

teste@badtux-WS:~$ cat .bash_history&nbsp;

date
cd ../../
ls
cd
history
teste@badtux-WS:~$&nbsp;

Outra&nbsp;variável&nbsp;interessante é a $HISTFILE. Ela é&nbsp;responsável&nbsp;por indicar o arquivo onde serão armazenados o&nbsp;histórico&nbsp;de comandos. Como disse, por padrão, o arquivo é o .bash_history.


teste@badtux-WS:~$ echo $HISTFILE

/home/teste/.bash_history


Modificando o valor da&nbsp;variável:

teste@badtux-WS:~$ export HISTFILE=/home/teste/giropops

Como o&nbsp;histórico&nbsp;de comandos executados é gravado no arquivo no momento do logout do&nbsp;usuário, vamos fazer o logout para confirmar a criação do novo arquivo de histórico de comandos.


teste@badtux-WS:~$ logout

root@badtux-WS:~# su - teste



teste@badtux-WS:~$ ls -lha

total 28K
drwxr-xr-x 2 teste teste 4,0K Nov 21 13:11 .
drwxr-xr-x 5 root &nbsp;root &nbsp;4,0K Nov 21 12:54 ..
-rw------- 1 teste teste &nbsp; 55 Nov 21 13:11 .bash_history
-rw-r--r-- 1 teste teste &nbsp;220 Nov 21 12:54 .bash_logout
-rw-r--r-- 1 teste teste 3,2K Nov 21 12:54 .bashrc
-rw------- 1 teste teste &nbsp; 78 Nov 21 13:11 giropops



teste@badtux-WS:~$ cat giropops&nbsp;

echo $HISTFILE
cd
echo $HISTFILE
export HISTFILE=/home/teste/giropops
ls -lha
teste@badtux-WS:~$&nbsp;


Repare que o arquivo giropops foi criado e nele armazenado o&nbsp;histórico&nbsp;de comandos. Porém vale lembrar que essa&nbsp;variável&nbsp;que modificamos, voltará com seu valor padrão quando efetuarmos o logout. Para que isso não aconteça, é&nbsp;necessário&nbsp;declarar o novo valor da&nbsp;variável&nbsp;em algum arquivo que é lido no momento do login do&nbsp;usuário, como por exemplo o .bashrc.



Sempre me perguntam se conseguimos "esconder" determinado comando executado do&nbsp;histórico, e sim, temos como fazê-lo de duas formas. Uma seria editando o arquivo .bash_history e removendo a linha em questão. A outra forma, e mais descente, seria editando a&nbsp;variável&nbsp;$HISTCONTROL dizendo a ela para que ignore comandos iniciados por espaço:


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

teste@badtux-WS:~$ echo "essa linha ele loga"

essa linha ele loga

teste@badtux-WS:~$ &nbsp;echo "essa linha ele não loga"

essa linha ele não loga

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

&nbsp; &nbsp; 1 &nbsp;date
&nbsp; &nbsp; 2 &nbsp;cd ../../
&nbsp; &nbsp; 3 &nbsp;ls
&nbsp; &nbsp; 4 &nbsp;cd
&nbsp; &nbsp; 5 &nbsp;history
&nbsp; &nbsp; 6 &nbsp;ls
&nbsp; &nbsp; 7 &nbsp;ls -lha
&nbsp; &nbsp; 8 &nbsp;ls
&nbsp; &nbsp; 9 &nbsp;exho teste
&nbsp; &nbsp;10 &nbsp;ls
&nbsp; &nbsp;11 &nbsp;ls -lha
&nbsp; &nbsp;12 &nbsp;cat giropops
&nbsp; &nbsp;13 &nbsp;echo $HISTFILE
&nbsp; &nbsp;14 &nbsp;ls -lha
&nbsp; &nbsp;15 &nbsp;echo $HISTCONTROL
&nbsp; &nbsp;16 &nbsp;export HISTCONTROL=ignorespace
&nbsp; &nbsp;17 &nbsp;echo "essa linha ele loga"
&nbsp; &nbsp;18 &nbsp;history
teste@badtux-WS:~$&nbsp;


Lembrando apenas que isso não é uma boa pratica e deve ser levado apenas em consideração como aprendizado e não para um ambiente em produção!



Podemos adicionar uma informação bastante&nbsp;relevante&nbsp;na&nbsp;saída&nbsp;do history que é o TIMESTAMP, ou seja, ele irá mostra na&nbsp;saída&nbsp;do comando, o&nbsp;horário&nbsp;em que o comando foi executado, por padrão essa informação não é visualizada.

Para ativar essa opção, basta modificar o valor da&nbsp;variável&nbsp;HISTTIMEFORMAT conforme sua necessidade:


teste@badtux-WS:~$ export HISTTIMEFORMAT='%F %T '

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

&nbsp; &nbsp; 1 &nbsp;2011-11-21 13:11:50 date
&nbsp; &nbsp; 2 &nbsp;2011-11-21 13:11:50 cd ../../
&nbsp; &nbsp; 3 &nbsp;2011-11-21 13:11:50 ls
&nbsp; &nbsp; 4 &nbsp;2011-11-21 13:11:50 cd
&nbsp; &nbsp; 5 &nbsp;2011-11-21 13:11:50 history
&nbsp; &nbsp; 6 &nbsp;2011-11-21 13:11:50 ls
&nbsp; &nbsp; 7 &nbsp;2011-11-21 13:11:50 ls -lha
&nbsp; &nbsp; 8 &nbsp;2011-11-21 13:11:50 ls
&nbsp; &nbsp; 9 &nbsp;2011-11-21 13:11:50 exho teste
&nbsp; &nbsp;10 &nbsp;2011-11-21 13:11:51 ls
&nbsp; &nbsp;11 &nbsp;2011-11-21 13:11:58 ls -lha
&nbsp; &nbsp;12 &nbsp;2011-11-21 13:12:03 cat giropops
&nbsp; &nbsp;13 &nbsp;2011-11-21 13:12:40 echo $HISTFILE
&nbsp; &nbsp;14 &nbsp;2011-11-21 13:17:47 ls -lha
&nbsp; &nbsp;15 &nbsp;2011-11-21 13:22:02 echo $HISTCONTROL
&nbsp; &nbsp;16 &nbsp;2011-11-21 13:22:20 export HISTCONTROL=ignorespace
&nbsp; &nbsp;17 &nbsp;2011-11-21 13:22:30 echo "essa linha ele loga"
&nbsp; &nbsp;18 &nbsp;2011-11-21 13:22:48 history
&nbsp; &nbsp;19 &nbsp;2011-11-21 13:30:37 export HISTTIMEFORMAT='%F %T '
&nbsp; &nbsp;20 &nbsp;2011-11-21 13:30:39 history
teste@badtux-WS:~$&nbsp;


Bem, a primeira parte termina por aqui, logo estarei disponibilizando a segunda parte onde veremos outras dicas importantes do comando history, como consultar o&nbsp;histórico&nbsp;de comandos através de atalhos de teclado, ou ainda, conhecer outras&nbsp;variáveis&nbsp;do history&nbsp;e suas respectivas funções!!! Além de outras dicas de Shell!!! Aguardem!!! ;)