Bash History
June 4th, 2008 | by Gustavo Lichti |Quem usa Linux, Unix e Mac já deve estar acostumado com o Bash, "o interpretado de comandos", "o Shell", "a linha de comando", "o modo texto". Cada um chama de de um jeito, mas não importa como você realmente chama, mas sabido que no mundo linux e unix o Bash vem como padrão na maioria das distribuições e no Mac o bash é o padrão. O Bash não é o único shell existente, mas, é o mais popular.
O Bash, como maioria dos interpretadores de comandos, possui vários recursos embutido. Um deles é o 'History' ou 'Bash History' o qual vou descrever aqui hoje.
O Bash History tem como objetivo armazenar os últimos comandos digitados pelo usuário, afim de auxiliar o usuário com a necessidade de repetições de comandos, e lembrar em caso de comandos digitados há alguns dias ou horas.
Esses comandos são armazenados no arquivo ~/.bash_history .
gustavo@gustavo-laptop:~$ hostname
gustavo-laptop
gustavo@gustavo-laptop:~$ tail .bash_history
mv colorize-0.3.4/colorizerc /etc
sudo cp colorize-0.3.4/colorizerc /etc
sudo cp colorize-0.3.4/colorize /usr/bin/
colorize
cat /var/log/messages | colorize
sudo bin/mount.sh
apt-get update
apt-get upgrade
apt-get dist-upgrade
sudo bin/mount.sh
Você pode perceber que o arquivo .bash_history, realmente contém comandos, mas o útimo comando que eu digitei foi "hostname" e ele não esta no arquivo. Bom o Bash armazena os últimos comandos digitados em memória e só adiciona ao fim do .bash_history ao finalizar a sessão.
Então para tem uma listagem atualizada sem fechar o shell, usamos o comando history.
gustavo@gustavo-laptop:~$ echo oi
oi
gustavo@gustavo-laptop:~$ history | tail
496 apt-get update
497 apt-get upgrade
498 apt-get dist-upgrade
499 sudo bin/mount.sh
500 clear
501 hostname
502 tail .bash_history
503 clear
504 echo oi
505 history | tail
Podemos perceber agora que na listagem dos últimos comandos inclui-se o 'echo oi' e o próprio 'history'
Quando precionamos a 'seta para cima' ela nos trás os útimos comandos, isso é um dos recursos do bash history, mas esse é apenas um de vários. Vou mostrar alguns.
!! -- execulta o último comando digitado
gustavo@gustavo-laptop:~$ hostname
gustavo-laptop
gustavo@gustavo-laptop:~$ !!
hostname
gustavo-laptop
!n -- Execulta no comando da linha 'n' do history
gustavo@gustavo-laptop:~$ history | tail
500 clear
501 hostname
502 tail .bash_history
503 clear
504 echo oi
505 history | tail
506 clear
507 hostname
508 clear
509 history | tail
gustavo@gustavo-laptop:~$ !501
hostname
gustavo-laptop
!texto -- Executa o comando mais recente que começa com 'texto'
gustavo@gustavo-laptop:~$ history | tail -15
498 apt-get dist-upgrade
499 sudo bin/mount.sh
500 clear
501 hostname
502 tail .bash_history
503 clear
504 echo oi
505 history | tail
506 clear
507 hostname
508 clear
509 history | tail
510 hostname
511 clear
512 history | tail -15
gustavo@gustavo-laptop:~$ !sudo
sudo bin/mount.sh
[sudo] password for gustavo:
!?texto -- Executa o comando mais recente que contém 'texto'
gustavo@gustavo-laptop:~$ history | tail -15
501 hostname
502 tail .bash_history
503 clear
504 echo oi
505 history | tail
506 clear
507 hostname
508 clear
509 history | tail
510 hostname
511 clear
512 history | tail -15
513 sudo bin/mount.sh
514 clear
515 history | tail -15
gustavo@gustavo-laptop:~$ !?mount
sudo bin/mount.sh
^texto1^texto2 -- Executa o último comando substituindo o 'texto1' pelo o 'texto2'
gustavo@gustavo-laptop:~$ ls
arq1 myfile
gustavo@gustavo-laptop:~$ rm arq1
gustavo@gustavo-laptop:~$ ^arq1^myfile
rm myfile
gustavo@gustavo-laptop:~$ ls
Ctrl p -- recupera os comando do history do útimo comando digitado ao primeiro(equivalente a 'seta para cima')
Ctrl n -- volta os comando recuperados pelo ctrl p (Seta para baixo)
Ctrl r[texto] -- Procura um comando que contenha [texto] do último comando para o primeiro
gustavo@gustavo-laptop:~$ history | tail -15
518 ls /etc
519*
520 touch arq1
521*
522 ls
523 clear
524 rm arq1
525 rm myfile
526* ls
527 clear
528 history
529 clear
530 history | tail
531 history | tail -20
532 history | tail -15
(reverse-i-search)`arq': rm arq1




7 Responses to “Bash History”
By anselmo on Jun 6, 2008 | Reply
Dá uma olhada em http://www.oreillynet.com/onlamp/blog/2007/01/whats_in_your_bash_history.html .Lá fala sobre as variáveis HISTFILESIZE e HISTSIZE que regulam o tamanho do .bash_history e número de comados armazenados, respectivamente.
By Gustavo Lichti on Jun 6, 2008 | Reply
Anselmo, legal a sua citação, eu tenho conhecimento das variáveis, mas realmente na hora do post passou em branco.
By anselmo on Jun 6, 2008 | Reply
Fica como citação pra galera que for ler seu post ;)
By Rui Vilela on Jun 10, 2008 | Reply
útil mas perigoso com um hábito crescente em relação à pesquisa por padrão. (porque regride no history até encontrar um padrão conhecido, não tem de ser o último comando, e não tem confirmação prévia.)
É mais seguro e prático usar este género de variáveis para usar os parâmetros dos últimos comandos: "mkdir teste", "echo !:1" equivale a "echo teste", … Há outras formas.
By Leo on Aug 11, 2009 | Reply
Caro Gustavo, excelente post.
Infelizmente nada disso funciona na maq UNIX que estou acessando.
Me conecto à uma maq UNIX através de SSH.
Mas a "seta para cima" não me traz o último comando; nem "!!"; nem o ctrl+p; mesmo qdo dou um "history" e vejo os últimos comandos digitados.
Percebi tb que não tenho o arquivo .bashrc no meu home.
Tenho o arquivo .profile que contem a variável HISTSIZE=10000.
Tenho tb o arquivo .sh_history (acredito que esse seja o equivalente ao .bash_history).
Como devo proceder para "ativar" essa funcionalidade?