Para entender o comportamento do histórico do bash, primeiro você precisa saber o seguinte:
- Há o histórico no arquivo de histórico.
- Existe a história na memória de um processo do bash.
- O histórico na memória de um processo do bash não é sincronizado com o histórico na memória de qualquer outro processo do bash.
- O histórico na memória de um processo do bash não é sincronizado com o histórico no arquivo, a menos que seja explicitamente solicitado ou durante algum evento específico (veja abaixo).
Usando as configurações padrão, o ciclo de vida de uma sessão do bash com relação ao histórico é o seguinte:
- Durante a inicialização, o bash lerá o arquivo de histórico. O conteúdo do arquivo histórico agora está na memória do processo do bash.
- Durante o uso normal, apenas o histórico da memória é manipulado.
- Durante o desligamento, o histórico na memória é gravado no arquivo de histórico, substituindo qualquer conteúdo anterior do arquivo de histórico.
O comportamento aparentemente não determinístico que você observou é principalmente porque o conteúdo do arquivo de histórico é sempre o histórico da última sessão fechada do bash, e o bash apenas lê o arquivo do histórico durante a inicialização.
Leia o manual do bash para obter uma explicação mais detalhada do processo de inicialização e desligamento.
Observe que, com as configurações padrão, quero dizer as configurações padrão do bash. Sua distribuição pode ter fornecido um .bashrc
(ou /etc/bash.bashrc
) que altera esse comportamento.
Ao ativar a opção de shell, histappend
você pode pedir ao bash para anexar em vez de substituir o arquivo de histórico. Você pode ativar histappend
usando o comando shopt -s histappend
. Para ter essa opção sempre ativada, você deve colocar o comando no seu .bashrc
(ou outro arquivo de inicialização). Leia mais sobre o shopt
comando no manual do bash
Observe que a habilitação histappend
não reduzirá muito o comportamento aparentemente não determinístico. Isso ocorre porque cada sessão do bash ainda tem seu próprio histórico na memória. É possível ter um histórico do bash principalmente sincronizado. Há um guia sobre como fazer com que cada processo do bash tenha um histórico sincronizado principalmente em um encadeamento no estouro de pilha .
usando o comando interno, history
você pode dizer explicitamente ao bash para ler o histórico de arquivo para a memória ou para gravar da memória para o arquivo. Por exemplo: history -r
irá ler o conteúdo do arquivo e anexá-lo ao histórico na memória. history -w
gravará o histórico atual da memória para o arquivo, substituindo o conteúdo anterior. Isso é basicamente o que acontece durante o desligamento. Leia mais sobre o history
comando no manual do bash
Para completar, aqui está uma lista das variáveis internas que modificam o comportamento do histórico:
HISTFILE
: o arquivo para ler e escrever o histórico.
HISTFILESIZE
: a contagem máxima de linhas para o arquivo de histórico.
HISTSIZE
: a contagem máxima de linhas para o histórico na memória.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: Não é relevante para esta discussão. Leia o manual do bash para obter detalhes.