Resposta curta:
HISTSIZE
é o número de linhas ou comandos armazenados na memória em uma lista de histórico enquanto a sessão do bash está em andamento.
HISTFILESIZE
é o número de linhas ou comandos que (a) são permitidos no arquivo de histórico no momento da inicialização de uma sessão e (b) são armazenados no arquivo de histórico no final de sua sessão do bash para uso em sessões futuras.
Observe a distinção entre file
: no disco - e list
: na memória.
Resposta longa:
Todas as informações acima + alguns exemplos:
Exemplo 1 :
HISTFILESIZE=10
eHISTSIZE=10
- Você inicia sua sessão.
- Seu HISTFILE (arquivo que armazena seu histórico de comandos do bash) está truncado para conter HISTFILESIZE = 10 linhas.
- Você escreve 50 linhas.
- No final dos seus 50 comandos, apenas os comandos 41 a 50 estão na sua lista de histórico, cujo tamanho é determinado por HISTSIZE = 10.
- Você termina sua sessão.
- Supondo que
histappend
não esteja ativado, os comandos 41 a 50 são salvos no HISTFILE, que agora possui os 10 comandos que ele mantinha no início, além dos 10 comandos recém-gravados.
- Seu HISTFILE está truncado para conter HISTFILESIZE = 10 linhas.
- Agora você tem 10 comandos em seu histórico - os últimos 10 que você digitou na sessão que terminou.
- Ao iniciar uma nova sessão, você inicia novamente com 1 com um HISTFILE de HISTFILESIZE = 10.
Exemplo 2 :
HISTFILESIZE=10
eHISTSIZE=5
- Você inicia sua sessão.
- Seu HISTFILE (arquivo que armazena seu histórico de comandos do bash) está truncado para conter no máximo HISTFILESIZE = 10 linhas.
- Você escreve 50 linhas.
- No final dos seus 50 comandos, apenas os comandos 46 a 50 estão na sua lista de histórico, cujo tamanho é determinado por HISTSIZE = 5.
- Você termina sua sessão.
- Supondo que
histappend
não esteja ativado, os comandos 46 a 50 são salvos no HISTFILE, que agora possui os 10 comandos que ele mantinha no início, além dos 5 comandos recém-gravados.
- Seu HISTFILE está truncado para conter HISTFILESIZE = 10 linhas.
- Agora você tem 10 comandos em seu histórico - 5 de uma sessão anterior e os últimos 5 que você digitou na sessão que acabou de terminar.
- Ao iniciar uma nova sessão, você inicia novamente com 1 com um HISTFILE de HISTFILESIZE = 10.
Exemplo 3 :
HISTFILESIZE=5
eHISTSIZE=10
- Você inicia sua sessão.
- Seu HISTFILE (arquivo que armazena seu histórico de comandos do bash) está truncado para conter no máximo HISTFILESIZE = 5 linhas.
- Você escreve 50 linhas.
- No final dos seus 50 comandos, apenas os comandos 41 a 50 estão na sua lista de histórico, cujo tamanho é determinado por HISTSIZE = 10.
- Você termina sua sessão.
- Supondo que
histappend
não esteja ativado, os comandos 41 a 50 são salvos no HISTFILE, que agora possui os 5 comandos que ele mantinha no início, além dos 10 comandos recém-gravados.
- Seu HISTFILE está truncado para conter HISTFILESIZE = 5 linhas.
- Agora você tem 5 comandos em seu histórico - os últimos 5 que você digitou na sessão que terminou.
- Ao iniciar uma nova sessão, inicie novamente na etapa 1 com um HISTFILE de HISTFILESIZE = 5.
Informações de elixir_sinari :
O histórico "arquivo" não é atualizado à medida que você digita os comandos. Os comandos são armazenados em uma "lista" separadamente (acessados pelo comando history). O número desses comandos armazenados é controlado pelo valor HISTSIZE. Quando o shell (interativo) sai, as últimas linhas $ HISTSIZE são copiadas / anexadas a $ HISTFILE dessa "lista". Se HISTFILESIZE estiver definido, após esta operação, será garantido que apenas as linhas $ HISTFILESIZE (mais recentes) existam em $ HISTFILE. E quando o shell é iniciado, a "lista" é inicializada de $ HISTFILE até um máximo de comandos $ HISTSIZE.
E a partir da man bash
página:
O valor da variável HISTSIZE é usado como o número de comandos para salvar em uma lista de histórico. O texto dos últimos comandos HISTSIZE (padrão 500) é salvo. (...)
Na inicialização, o histórico é inicializado a partir do arquivo nomeado pela variável HISTFILE (padrão ~ / .bash_history). O arquivo nomeado pelo valor de HISTFILE é truncado, se necessário, para conter não mais que o número de linhas especificado pelo valor de HISTFILESIZE. (...) Quando um shell interativo sai, as últimas linhas $ HISTSIZE são copiadas da lista de histórico para $ HISTFILE. Se a opção shell histappend estiver ativada (consulte a descrição do shopt em SHELL BUILTIN COMMANDS abaixo), as linhas serão anexadas ao arquivo de histórico, caso contrário, o arquivo de histórico será substituído. Se HISTFILE estiver desabilitado, ou se o arquivo do histórico for gravável, o histórico não será salvo. (...) Após salvar o histórico, o arquivo do histórico é truncado para conter não mais que linhas HISTFILESIZE. Se HISTFILESIZE não estiver definido,
Construindo sobre o que o arturomp disse e em um esforço para torná-lo um pouco mais claro.
Supondo que você tenha 2000 e alguma longa história ..
Você pode reduzir o que é mostrado com
HISTSIZE
Agora, não importa quantos comandos você digitar, apenas os últimos 5 serão gravados.
Podemos ver claramente que nosso primeiro comando ("ABC") não está no histórico, pois apenas os cinco últimos comandos foram gravados.
Agora, o histórico total é armazenado em um arquivo (
.bash_history
) e você pode alterar quanto tempo esse arquivo fica com o arquivoHISTFILESIZE
. Por exemplo, com a2033
HISTFILESIZE
, no meu caso, eu teria isso:fonte
HISTSIZE=-1
eHISTFILESIZE=-1
.bash
página homem diz:Non-numeric values and numeric values less than zero inhibit truncation
mas então eu não tinha coragem de verificar se isso é verdade, porque eu não quero perder a minha história :-)HISTSIZE='INFINITY'
eHISTFILESIZE='ANDBEYOND'
. Como eles não são numéricos, eles salvam tudo. Obrigado pela dica!