Declaração do problema
Tenho seguido vários exemplos de como fazer coisas criativas com a história do bash, como:
# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'
... mas parecia funcionar de forma intermitente. Se o arquivo de histórico já existir com o histórico anterior, está tudo 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 Solaris
- o diretório inicial é montado em NFS
Etapas de diagnóstico
Eu me livrei do meu .bashrc
e configurei meu .bash_profile
para:
HISTFILE=$HOME/.bash_history.test
Eu então iniciaria um shell de login (por exemplo, ssh para outra máquina) e faria 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á anexado 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 delefazcrie-o. Depois disso, history -a
funciona conforme o esperado... exceto quando PROMPT_COMMAND="history -a; history -c; history -r"
. Quando eu tinha essa configuração, mesmo sair do shell não criava o arquivo de histórico (a menos que eu executasse exec bash
primeiro).
Tentei então uma instalação não padrão do bash (4.2.x) e o problema não se manifestou.
Responder1
Este tópico da lista de discussãoparece explicar estes problemas; citando a 2ª mensagem:
O código atual em bashhist.c:maybe_append_history() (que existe há pelo menos 15 anos) parece não lidar com o caso em que o número de linhas do histórico na sessão atual é igual ao número de entradas da lista de histórico. Ou seja, o código não acrescentará novas linhas se não achar que houve alguma linha lida no arquivo de histórico quando o shell foi iniciado. Isso parece errado e anexei um patch que corrige isso. No entanto, o código existe em sua forma atual há tanto tempo que estou me perguntando se há ou não algum outro motivo para isso.
(Chet Ramey, lista de discussão do GNU bash)
Além disso, oregistro de alteraçõespara 4.2 tem o seguinte 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 instalar uma versão mais recente do bash para resolver esse problema.
Espero que isso ajude alguém no futuro.