bash: history - não está escrevendo a menos que HISTFILE já tenha texto

1

Declaração do problema

Eu tenho acompanhado inúmeros exemplos para fazer coisas criativas com histórico de bash ao longo das linhas de:

# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'

... mas parecia funcionar de forma intermitente. Se o arquivo de histórico já existe com histórico anterior, então tudo está bem.

Outras informações relevantes

  • versões bash: 3.2.51, 4.1.2 e 4.2.45
    • 4.2.x não parece ter esse problema, mas é uma instalação não padrão
  • SO: Linux e amp; Solaris
  • home dir é montado em NFS

Etapas de diagnóstico

Eu me livrei do meu .bashrc & defina meu .bash_profile para:

HISTFILE=$HOME/.bash_history.test

Eu começaria então um shell de login (por exemplo, ssh para outra máquina) & Faça algo como o seguinte:

~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
    1  cat .bash_history.test
    2  history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory

O arquivo de histórico não será adicionado por history -a nas seguintes circunstâncias:

  • O arquivo ainda não existe
  • O arquivo está vazio ou contém apenas novas linhas; até mesmo o espaço em branco fará com que funcione

... no entanto, quando o shell sai, faz criá-lo. Posteriormente, history -a funciona como esperado ... exceto quando PROMPT_COMMAND="history -a; history -c; history -r" . Quando eu tinha esse conjunto, até mesmo sair do shell não criava o arquivo de histórico (a menos que eu executei exec bash primeiro).

Eu tentei com uma instalação não padrão do bash (4.2.x) e o problema não se manifestou.

    
por Brian Vandenberg 17.07.2015 / 20:25

1 resposta

1

Este tópico da lista de discussão parece explicar esses problemas; citando a segunda msg:

The current code in bashhist.c:maybe_append_history() (which has existed for at least 15 years) seems to not handle the case where the number of history lines in the current session is equal to the number of history list entries. That is, the code won't append new lines if it doesn't think there were any lines read from the history file when the shell started. That seems wrong, and I've attached a patch that fixes it. However, the code has existed in its current form for so long that I'm wondering whether or not there is some other reason for it.

(Chet Ramey, GNU bash mailing list)

Além disso, o changelog para 4.2 possui as seguintes texto:

+                  8/13
+                  ----
+bashhist.c
+   - in maybe_append_history, change check for history_lines_this_session
+     so that we append the lines to the file if it's equal to the value
+     returned by where_history().  This means that without this change,
+     the history won't be appended if all the lines in the history list
+     were added in the current session since the last time the history
+     file was read or written.  Fixes bug reported by Bruce Korb
+     <[email protected]>

(git.savannah.gnu.org, bash git repo)

Obviamente, precisamos obter uma versão mais nova do bash instalada para resolver esse problema.

Espero que isso ajude alguém mais adiante.

    
por 17.07.2015 / 20:25