Perda de histórico de bash ao usar histappend

18

Eu gosto de manter muita história, então eu histappendcoloquei na minha .bashrc. Na maioria das vezes, tudo funciona bem, com a história construída a partir de muitas conchas anexadas. No entanto, de vez em quando, iniciarei um novo shell e descobri que perdi o histórico inteiro - e geralmente contém apenas alguns dos comandos do último shell para sair (ou seja, não é apenas sobrescrever em vez de anexar ) Por isso, desconfio que isso esteja acontecendo na saída do shell, e não em algum outro processo que mata o .bash_historyarquivo. Apoiando essa conclusão, tenho números de comando do histórico no meu prompt e nunca os vi pular.

Alguém já teve um problema semelhante? Ou até mesmo ter sugestões de como rastrear o problema?

Cascabel
fonte

Respostas:

13

Desculpe responder minha própria pergunta, mas nenhuma das outras respostas realmente resolve o problema.

Eu finalmente descobri que isso só acontece quando se fecha gnome-terminal(por exemplo, arquivo> exit, o botão 'x', alt + F4) e, mesmo assim, geralmente apenas ao fechar vários terminais em rápida sucessão. Isso nunca acontece quando se usa ctrl-D para fechar o shell, deixando o terminal seguir.

Se eu puder identificá-lo bem o suficiente, arquivarei um relatório de erro do terminal gnome. Enquanto isso, talvez isso ajude outras pessoas que chegam do google!

Cascabel
fonte
10

Não faço ideia por que isso acontece, mas talvez você possa contornar o problema forçando o bash a gravar em seu arquivo de histórico sempre que ele exibir um prompt:

PROMPT_COMMAND="history -a; history -n"

Isso gravará (-a) e, em seguida, relerá (-n) o arquivo de histórico sempre que o bash solicitar o próximo comando. Benefício adicional: você obterá o comando X no shell 1 no histórico do shell 2.

innaM
fonte
Não funciona em GNU bash, versão 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackintosh
2
Você pode explicar o que "não funciona" significa?
innaM
3
O benefício adicional que você cita é, em muitos casos, uma desvantagem. Não é o comportamento que estou procurando, pois posso estar realizando duas tarefas completamente separadas em cartuchos separados e não quero misturar sua história. Isso provavelmente também não ajudaria em nada. Quando o histórico desaparece, ele exclui o conteúdo de .bash_history - não espero que isso importe se eles foram gravados na saída do shell ou por PROMPT_COMMAND.
Cascabel
5
history -né esquisito. É mais confiável de fazer history -a; history -c; history -r. Para explicar isso, primeiro observarei que history -afaz a coisa certa - você .bash_historyconterá todos os seus comandos digitados, na ordem em que foram digitados - assumindo que você execute history -atodos os comandos. O desafio é manter a ideia de histórico do shell em sincronia com o arquivo .bash_history. Isso é fácil -ce -r, o problema é que pode ser lento se for grande. -npode quebrar porque identifica incorretamente quais linhas são novas. (Eu estou ficando sem espaço aqui!)
Aaron McDaid
4
(... se você usar -n) Imagine que você executar um comando no shell 1: ls. Em outro shell, o Shell Dois, você executa cd. Agora, o histórico no .bash_history está correto por causa do history -ano seu PROMPT_COMMAND- ele conterá ls \n cd \n. Em seguida, você retorna ao shell One e digita pwd. Shell One pensa que só havia comando na história ( ls). Agora ele acha que existem dois comandos ( lse pwd) na história. Quando você faz -nisso pensa (eu tenho dois comandos na minha história, e há dois comandos em .bash_history, conseqüentemente eu sou até à data.)
Aaron McDaid
3

Minha experiência foi que as conchas atualizaram o arquivo de histórico no momento da saída. Portanto, o "histórico" inicial de um shell dependia da visão do histórico mais recente do shell.

O resultado disso é que você pode obter comandos indo e vindo do histórico, dependendo de como outros shells começaram e pararam.

David Mackintosh
fonte
2
Entendo muito bem como o arquivo de histórico é gravado - é por isso que especifiquei na minha pergunta que estou usando histappend. O problema não é conteúdo inesperado, mas uma perda total de conteúdo armazenado anteriormente.
Cascabel
Isso explica por que eu estava perdendo minha história ...
B Seven
1

Eu já vi isso acontecer antes, mas havia um problema com erros de disco que estavam acontecendo com frequência crescente. Eu faria uma varredura na unidade. Se a unidade estiver funcionando corretamente, eu verificaria se esse arquivo não está ultrapassando um limite arbitrário do histórico do shell.

Algo que possa impedir que isso aconteça seria manter a remoção do arquivo de volta para 80 linhas ou quantos comandos você deseja que o histórico seja.

Axxmasterr
fonte
Não tenho acesso root na máquina em que isso está acontecendo, mas estou bastante confiante de que a unidade está ok. Meu diretório pessoal é armazenado em um servidor em nosso laboratório (bastante RAID, acredito) e montado em NFS. O que você quer dizer com "limite arbitrário do histórico do shell"? Tudo isso está acontecendo bem abaixo de HISTSIZE e HISTFILESIZE, e embora eu tenha definido um tamanho grande, eles estão bem abaixo do intbash e os armazenam como.
Cascabel
Eu diria que a entrada de David Mackintosh é provavelmente o que está acontecendo.
Axxmasterr
1
Estou totalmente certo de que não é. Eu nunca deveria terminar com apenas dois comandos no meu histórico, quando o último shell a sair tinha algumas dúzias de comandos, o arquivo de histórico tinha várias centenas e HISTSIZE / HISTFILESIZE está definido como 10000.
Cascabel