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

Tags: , , , , , ,

  1. 7 Responses to “Bash History”

  2. 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.

  3. 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.

  4. By anselmo on Jun 6, 2008 | Reply

    Fica como citação pra galera que for ler seu post ;)

  5. 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.

  6. 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?

  1. 2 Trackback(s)

  2. Jun 6, 2008: Bash History
  3. Aug 27, 2008: Gustavo Lichti » Blog Archive » Ubuntu HotKeys

Post a Comment