bash HISTSIZE vs. HISTFILESIZE?

174

Qual é a diferença em HISTSIZEvs. HISTFILESIZE?

Eles são usados ​​para estender o histórico do bash além das 500 linhas padrão.

Parece haver falta de clareza aqui e em outros fóruns sobre por que eles são necessários. ( Exemplo 1 , Exemplo 2 , Exemplo 3 ).

arturomp
fonte

Respostas:

289

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=10eHISTSIZE=10

  1. Você inicia sua sessão.
  2. Seu HISTFILE (arquivo que armazena seu histórico de comandos do bash) está truncado para conter HISTFILESIZE = 10 linhas.
  3. Você escreve 50 linhas.
  4. 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.
  5. Você termina sua sessão.
  6. Supondo que histappendnã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.
  7. Seu HISTFILE está truncado para conter HISTFILESIZE = 10 linhas.
  8. Agora você tem 10 comandos em seu histórico - os últimos 10 que você digitou na sessão que terminou.
  9. Ao iniciar uma nova sessão, você inicia novamente com 1 com um HISTFILE de HISTFILESIZE = 10.

Exemplo 2 : HISTFILESIZE=10eHISTSIZE=5

  1. Você inicia sua sessão.
  2. Seu HISTFILE (arquivo que armazena seu histórico de comandos do bash) está truncado para conter no máximo HISTFILESIZE = 10 linhas.
  3. Você escreve 50 linhas.
  4. 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.
  5. Você termina sua sessão.
  6. Supondo que histappendnã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.
  7. Seu HISTFILE está truncado para conter HISTFILESIZE = 10 linhas.
  8. 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.
  9. Ao iniciar uma nova sessão, você inicia novamente com 1 com um HISTFILE de HISTFILESIZE = 10.

Exemplo 3 : HISTFILESIZE=5eHISTSIZE=10

  1. Você inicia sua sessão.
  2. Seu HISTFILE (arquivo que armazena seu histórico de comandos do bash) está truncado para conter no máximo HISTFILESIZE = 5 linhas.
  3. Você escreve 50 linhas.
  4. 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.
  5. Você termina sua sessão.
  6. Supondo que histappendnã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.
  7. Seu HISTFILE está truncado para conter HISTFILESIZE = 5 linhas.
  8. Agora você tem 5 comandos em seu histórico - os últimos 5 que você digitou na sessão que terminou.
  9. 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 bashpá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,

arturomp
fonte
27
+1 Esta resposta é impressionantemente completa! Um pouco demais, eu acho. A maioria das pessoas não chega ao fim. Eu acho que você deve considerar resumindo-lo
slezica
22
@slezica Não concordo com a segunda parte do seu comentário: cheguei ao fim e posso dizer que todas as informações na resposta são úteis. O fato de algumas pessoas terem preguiça de ler algumas linhas não deve justificar a remoção de informações úteis para outras.
Bastien
1
@Bastien, assumindo que você é um analisador de pontos de bala, não terá dificuldades em ler isso.
Pithikos 11/11
6
Olha, meu disco rígido tem 1 TB e está praticamente vazio, e tenho vários ciclos de CPU e RAM inativos e quero salvar o máximo possível de histórico do bash - por isso, quando preciso procurar esse comando estúpido, não tenho ' em dois anos, eu sei que está na minha história do bash. Para torná-lo mais concreto, digamos até 50 MB de histórico do bash. Que valores você recomenda?
precisa saber é o seguinte
2
@ Matthew desculpe, não sei!
Arturomp
6

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 ..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Você pode reduzir o que é mostrado com HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

Agora, não importa quantos comandos você digitar, apenas os últimos 5 serão gravados.

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

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 arquivo HISTFILESIZE. Por exemplo, com a 2033 HISTFILESIZE, no meu caso, eu teria isso:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD
Pithikos
fonte
3
Quais valores você recomendaria se eu quiser que todo o histórico de todos os terminais simultâneos seja salvo no histórico do bash para sempre ? Em outras palavras, salve tudo sempre e nunca exclua nada.
CivFan
10
@CivFan: Definir HISTSIZE=-1e HISTFILESIZE=-1.
M. Dudley
2
Isso está completamente errado. Configurá-lo como -1 limpará tudo.
Brendan Byrd
3
@BrendanByrd A bashpágina homem diz: Non-numeric values and numeric values less than zero inhibit truncationmas então eu não tinha coragem de verificar se isso é verdade, porque eu não quero perder a minha história :-)
SebMa
3
@SebMa Alterei minhas configurações para HISTSIZE='INFINITY'e HISTFILESIZE='ANDBEYOND'. Como eles não são numéricos, eles salvam tudo. Obrigado pela dica!
Connor