Eu gosto de manter muita história, então eu histappend
coloquei 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_history
arquivo. 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?
Respostas:
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!
fonte
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:
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.
fonte
history -n
é esquisito. É mais confiável de fazerhistory -a; history -c; history -r
. Para explicar isso, primeiro observarei quehistory -a
faz a coisa certa - você.bash_history
conterá todos os seus comandos digitados, na ordem em que foram digitados - assumindo que você executehistory -a
todos os comandos. O desafio é manter a ideia de histórico do shell em sincronia com o arquivo .bash_history. Isso é fácil-c
e-r
, o problema é que pode ser lento se for grande.-n
pode quebrar porque identifica incorretamente quais linhas são novas. (Eu estou ficando sem espaço aqui!)-n
) Imagine que você executar um comando no shell 1:ls
. Em outro shell, o Shell Dois, você executacd
. Agora, o histórico no .bash_history está correto por causa dohistory -a
no seuPROMPT_COMMAND
- ele conteráls \n cd \n
. Em seguida, você retorna ao shell One e digitapwd
. Shell One pensa que só havia comando na história (ls
). Agora ele acha que existem dois comandos (ls
epwd
) na história. Quando você faz-n
isso pensa (eu tenho dois comandos na minha história, e há dois comandos em .bash_history, conseqüentemente eu sou até à data.)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.
fonte
histappend
. O problema não é conteúdo inesperado, mas uma perda total de conteúdo armazenado anteriormente.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.
fonte
int
bash e os armazenam como.