você está aqui: Home  → Arquivo de Mensagens

Compartilhamento do histórico do bash entre múltiplas sessões

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 14 de julho de 2010

Em um ambiente de janelas, frequentemente temos diversos terminais em execução, e cada um deles com seu histórico de comandos. Suponhamos que eu tenha uma janela com centenas de comandos executados, e outra com apenas cinco comandos. Se eu encerrar a segunda sessão primeiro, o histórico é sobrescrito e eu ficou com apenas os cinco comandos da segunda janela registrados. O ideal seria que o histórico fosse comum e dinâmico, ou seja, cada comando executado ficando disponível para todas as sessões em execução.

Executando o comando

  tail -f .bash_history

em uma das janelas, vemos os comandos sendo executados. Mas se fecharmos uma outra janela, vejam o que acontece:

  tail: .bash_history: arquivo truncado

Perdemos tudo que estava lá. A sessão que foi fechada truncou o arquivo .bash_history.

Para eliminar este problema, precisamos fazer com que a shell bash acrescente imediatamente, ao arquivo do histórico, os comandos executados em todas as sessões. Para isto, especificamos, no arquivo .bashrc, a seguinte diretiva:

  history -a

Eu acho esta forma de trabalho bastante conveniente. Eu considero particularmente irritante ter uma sessão de histórico para cada janela aberta. Não sei porque o padrão não é assim.

Aproveitando, no Twitter, tem um usuário chamado @bashtips, que fornece dicas curtas de bash. Vale a pena acompanhar.



 

 

Veja a relação completa dos artigos de Rubens Queiroz de Almeida

Opinião dos Leitores

Cristiano Amaral
27 Jul 2010, 16:24
/etc/profile
rogerio machado
27 Jul 2010, 13:45
legal, pelas dicas, mas qual é mais sensata utilizar?
@Cristiano
o comando que voce passou vai no .bashrc ou em outro lugar?
Fernando Roxo
14 Jul 2010, 11:23
Na verdade o truncamento é normal por várias razões, mas nada deverá ser perdido a não ser os comandos mais antigos.

O "history" (em princípio) é mantido em memória até o final da seção. Ao final dela por padrão o histórico é descarregado no arquivo de histórico (~/.history no Bourne ou Korn shell, ~/.bash_history no Bash ou mesmo de acordo com a variável $HISTFILE). O padrão é simplesmente fazer a adição no arquivo, mas como existe um limite para o crescimento do arquivo (500 linhas por padrão no Bash ou o que estiver estabelecido na variável $HISTFILESIZE), por esta razão o arquivo é recriado para manter o limite.

Um pequeno experimento, abra um terminal e use o comando :

watch "(ls -il .bash_history;wc -l .bash_history)"

Este comando vai ficar monitorando o arquivo de histórico quanto ao tamanho em bytes e o número de linhas. Abra um outro terminal e use alguns comandos, por exemplo:

$ ls /tmp
.....
$ date
.....
$ exit

O que você verá é que provavelmente a data de alteração do arquivo de histórico vai se alterar e o tamanho em bytes também pode se alterar, mas o número de linhas deve permanecer constante. Este número constante é garantido reescrevendo as últimas $HISTFILESIZE linhas após acrescebtar o histórico da seção atual. Isto significa que os comandos mais antigos serão perdidos. Como o 'inode' não mudou no 'ls' o arquivo foi reescrito na mesma posição que estava.

Eu trabalho com vários (por vezes dezenas) de terminais abertos ao mesmo tempo. Para evitar perda de histórico muito recente eu estabeleço o histórico com 1000 linhas e evito gravar linhas imediatamente repetidas, colocando no ~/.profile ou ~/.bashrc :

export HISTCONTROL=ignoredups


Espero que ajude.

Cristiano Am,aral
14 Jul 2010, 07:51
Ou "shopt -s histappend"
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script