Para entender o comportamento do histórico bash primeiro você precisa saber o seguinte:
- Há o histórico no arquivo de histórico.
- Existe o histórico na memória de um processo bash.
- O histórico na memória de um processo bash não é sincronizado com o histórico na memória de qualquer outro processo bash.
- O histórico na memória de um processo bash não é sincronizado com o histórico no arquivo, a menos que solicitado explicitamente ou durante algum evento específico (veja abaixo).
Usando as configurações padrão, o ciclo de vida de uma sessão bash em relação ao histórico é o seguinte:
- Durante o bash de inicialização, o arquivo de histórico será lido. O conteúdo do arquivo de histórico está agora na memória do processo bash.
- Durante o uso normal, apenas o histórico na memória é manipulado.
- Durante o desligamento, o histórico na memória é gravado no arquivo de histórico, sobrescrevendo 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 bash fechada, e o bash apenas lê o arquivo de histórico durante a inicialização.
Leia o manual do bash para 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 histappend
do shell, você pode dizer ao bash para anexar em vez de sobrescrever o arquivo de histórico. Você pode ativar histappend
usando o comando shopt -s histappend
. Para ter essa opção sempre ativada, você precisa colocar o comando no seu .bashrc
(ou outro arquivo de inicialização). Leia mais sobre o comando shopt
no manual do bash
Observe que ativar histappend
não reduzirá muito o comportamento aparentemente não determinístico. Isso ocorre porque cada sessão bash ainda tem seu próprio histórico na memória. É possível ter um histórico de 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 incorporado history
você pode dizer explicitamente ao bash para ler o histórico do arquivo para a memória, ou escrever da memória para o arquivo. Por exemplo: history -r
lerá o conteúdo do arquivo e o anexará ao histórico na memória. history -w
irá gravar o histórico atual da memória para o arquivo, sobrescrevendo o conteúdo anterior. Isso é basicamente o que acontece durante o desligamento. Leia mais sobre o comando history
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 gravar o histórico em. -
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.