@ David Dai está correto sobre este tópico de ajuda bash.
Aqui é o código bash relevante em C.
if (history_lines_this_session <= where_history () || force_append_history)
{
result = append_history (history_lines_this_session, hf);
history_lines_in_file += history_lines_this_session;
}
else
{
result = write_history (hf);
history_lines_in_file = history_lines_this_session;
}
shopt -s histappend define force_append_history como diferente de zero ( true ).
history_lines_this_session é o número de comandos que você digitou nesta sessão bash interativa. Quando você inicia o bash pela primeira vez, ele é 0. Ele aumenta em 1 cada vez que você digita um comando que é salvo no histórico.
where_history() é um índice na lista de histórico na memória, iniciando no índice 0. Ele aponta para o próximo índice para gravar o histórico. Por exemplo, quando você tem 0 histórico, ele será o índice 0. Quando você tem 6 linhas de histórico, ele será o índice 6.
Quando você inicia pela primeira vez bash e tem histórico no HISTFILE , where_history() , mas ficará limitado a <= HISTSIZE . Portanto, where_history() tem um valor máximo de HISTSIZE .
Depois de ler o HISTFILE , where_history() aumentará, mas history_lines_this_session ainda será 0. Quando você Enter HISTSIZE + 1 número de comandos, history_lines_this_session == HISTSIZE + 1 e where_history() == HISTSIZE (porque é limitado no máximo). Nesse ponto, (history_lines_this_session <= where_history()) == false so histórico será substituído se histappend estiver desativado.
Você pode testar isso no seu bash . Se histappend estiver desativado, depois que você executar HISTSIZE + 1 número de comandos, history_lines_this_session excederá where_history() por 1 e HISTFILE será sobrescrito. Você tem que ter certeza que outros comandos não estão mexendo com seu histórico para o teste funcionar (acontece no macOS). Use os seguintes comandos para desativar os comandos que podem interferir no histórico:
trap - EXIT
PROMPT_COMMAND=
SHELL_SESSION_HISTORY=0 # for macOS only