bash HISTSIZE vs. HISTFILESIZE?


174

Qual è la differenza in HISTSIZEvs. HISTFILESIZE?

Sono utilizzati per estendere la cronologia di bash oltre le 500 righe predefinite.

Sembra che ci sia mancanza di chiarezza qui e in altri forum sul perché entrambi sono necessari. ( Esempio 1 , Esempio 2 , Esempio 3 ).

Risposte:


289

Risposta breve:

HISTSIZE è il numero di righe o comandi archiviati in memoria in un elenco cronologico mentre la sessione bash è in corso.

HISTFILESIZE è il numero di righe o comandi che (a) sono consentiti nel file della cronologia al momento dell'avvio di una sessione e (b) sono memorizzati nel file della cronologia alla fine della sessione bash per l'uso in sessioni future.

Notare la distinzione tra file: su disco - e list: in memoria.

Risposta lunga:

Tutte le informazioni sopra + alcuni esempi:

Esempio 1 : HISTFILESIZE=10eHISTSIZE=10

  1. Inizi la sessione.
  2. Il tuo HISTFILE (file che memorizza la cronologia dei tuoi comandi bash), viene troncato per contenere HISTFILESIZE = 10 righe.
  3. Scrivi 50 righe.
  4. Alla fine dei 50 comandi, solo i comandi da 41 a 50 si trovano nell'elenco della cronologia, le cui dimensioni sono determinate da HISTSIZE = 10.
  5. Finisci la sessione.
  6. Supponendo che histappendnon sia abilitato, i comandi da 41 a 50 vengono salvati nel tuo HISTFILE che ora ha i 10 comandi che ha tenuto all'inizio più i 10 nuovi comandi scritti.
  7. Il tuo HISTFILE viene troncato per contenere HISTFILESIZE = 10 righe.
  8. Ora hai 10 comandi nella tua cronologia, gli ultimi 10 che hai appena digitato nella sessione appena terminata.
  9. Quando si avvia una nuova sessione, si ricomincia da 1 con un HISTFILE di HISTFILESIZE = 10.

Esempio 2 : HISTFILESIZE=10eHISTSIZE=5

  1. Inizi la sessione.
  2. Il tuo HISTFILE (file che memorizza la cronologia dei tuoi comandi bash), viene troncato per contenere al massimo HISTFILESIZE = 10 righe.
  3. Scrivi 50 righe.
  4. Alla fine dei tuoi 50 comandi, solo i comandi da 46 a 50 si trovano nell'elenco della cronologia, le cui dimensioni sono determinate da HISTSIZE = 5.
  5. Finisci la sessione.
  6. Supponendo che histappendnon sia abilitato, i comandi da 46 a 50 vengono salvati nel tuo HISTFILE che ora ha i 10 comandi che ha tenuto all'inizio più i 5 nuovi comandi scritti.
  7. Il tuo HISTFILE viene troncato per contenere HISTFILESIZE = 10 righe.
  8. Ora hai 10 comandi nella tua cronologia: 5 di una sessione precedente e gli ultimi 5 che hai appena digitato nella sessione appena terminata.
  9. Quando si avvia una nuova sessione, si ricomincia da 1 con un HISTFILE di HISTFILESIZE = 10.

Esempio 3 : HISTFILESIZE=5eHISTSIZE=10

  1. Inizi la sessione.
  2. Il tuo HISTFILE (file che memorizza la cronologia dei tuoi comandi bash), viene troncato per contenere al massimo HISTFILESIZE = 5 righe.
  3. Scrivi 50 righe.
  4. Alla fine dei 50 comandi, solo i comandi da 41 a 50 si trovano nell'elenco della cronologia, le cui dimensioni sono determinate da HISTSIZE = 10.
  5. Finisci la sessione.
  6. Supponendo che histappendnon sia abilitato, i comandi da 41 a 50 vengono salvati nel tuo HISTFILE che ora ha i 5 comandi che aveva all'inizio all'inizio più i 10 nuovi comandi scritti.
  7. Il tuo HISTFILE viene troncato per contenere HISTFILESIZE = 5 righe.
  8. Ora hai 5 comandi nella tua cronologia, gli ultimi 5 che hai appena digitato nella sessione appena terminata.
  9. Quando si avvia una nuova sessione, si ricomincia dal passaggio 1 con un HISTFILE di HISTFILESIZE = 5.

Informazioni da elixir_sinari :

Il "file" della cronologia non viene aggiornato durante la digitazione dei comandi. I comandi vengono memorizzati in un "elenco" separatamente (accessibile dal comando cronologia). Il numero di questi comandi memorizzati è controllato dal valore HISTSIZE. Quando la shell (interattiva) termina, le ultime righe di $ HISTSIZE vengono copiate / aggiunte a $ HISTFILE da tale "elenco". Se è impostato HISTFILESIZE, dopo questa operazione, si assicura che solo $ HISTFILESIZE (l'ultima) esistano in $ HISTFILE. E quando la shell inizia, la "lista" viene inizializzata da $ HISTFILE fino a un massimo di $ HISTSIZE comandi.

E dalla man bashpagina:

Il valore della variabile HISTSIZE viene utilizzato come numero di comandi da salvare in un elenco cronologico. Il testo degli ultimi comandi HISTSIZE (impostazione predefinita 500) viene salvato. (...)

All'avvio, la cronologia viene inizializzata dal file denominato dalla variabile HISTFILE (default ~ / .bash_history). Il file indicato dal valore di HISTFILE viene troncato, se necessario, per contenere non più del numero di righe specificato dal valore di HISTFILESIZE. (...) Quando esce una shell interattiva, le ultime righe di $ HISTSIZE vengono copiate dall'elenco della cronologia in $ HISTFILE. Se l'opzione shell histappend è abilitata (vedere la descrizione di shopt sotto COMANDI INCORPORATI SHELL di seguito), le righe vengono aggiunte al file della cronologia, altrimenti il ​​file della cronologia viene sovrascritto. Se HISTFILE non è impostato o se il file della cronologia non è scrivibile, la cronologia non viene salvata. (...) Dopo aver salvato la cronologia, il file della cronologia viene troncato per contenere non più di righe HISTFILESIZE. Se HISTFILESIZE non è impostato,


27
+1 Questa risposta è straordinariamente accurata! Un po 'troppo, penso. Molte persone non raggiungeranno la fine. Penso che dovresti considerare di riassumerlo
slezica,

22
@slezica Non sono d'accordo con la seconda parte del tuo commento: ho raggiunto la fine e posso dire che ogni informazione nella risposta è utile. Il fatto che alcune persone siano troppo pigre per leggere alcune righe non dovrebbe giustificare la rimozione di informazioni utili per gli altri.
Bastien,

1
@Bastien supponendo che tu sia un parser punto elenco, non avrai difficoltà a leggere questo.
Pithikos,

6
Guarda, il mio disco rigido è 1 TB e in gran parte vuoto, e ho grossi cicli di CPU e RAM inattivi e voglio salvare tutta la storia di bash il più ragionevolmente possibile - quindi quando devo cercare quello stupido comando che non ho Non corro tra due anni, so che è nella mia storia bash. Per renderlo più concreto, diciamo fino a 50 MB di storia bash. Quali valori mi consigliate?
CivFan,

2
@Matthew scusa, non lo so!
arturomp

6

Basandosi su ciò che Arturomp ha detto e nel tentativo di renderlo un po 'più chiaro.

Supponendo che tu abbia 2000 anni di storia ...

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

Puoi ridurre ciò che ti viene mostrato HISTSIZE

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

Ora, indipendentemente da quanti comandi digiti, verranno registrati solo gli ultimi 5.

~$ 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

Possiamo vedere chiaramente che il nostro primo comando ("ABC") non è nella storia poiché sono stati registrati solo gli ultimi 5 comandi.

Ora, la cronologia totale è memorizzata in un file ( .bash_history) e puoi modificare la durata di questo file con HISTFILESIZE. Ad esempio con a 2033 HISTFILESIZE, nel mio caso avrei questo:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
Quali valori mi consigliate se desidero salvare per sempre tutta la cronologia di tutti i terminali simultanei nella cronologia di bash ? In altre parole, salva tutto, sempre e non eliminare mai nulla.
CivFan,

10
@CivFan: Set HISTSIZE=-1e HISTFILESIZE=-1.
M. Dudley,

2
Questo è completamente sbagliato. Impostandolo su -1 si cancella tutto.
Brendan Byrd,

3
@BrendanByrd La bashpagina man dice: Non-numeric values and numeric values less than zero inhibit truncationma poi non ho avuto il coraggio di verificare se questo è vero perché non voglio perdere la mia storia :-)
SebMa

3
@SebMa Ho modificato le mie impostazioni in HISTSIZE='INFINITY'e HISTFILESIZE='ANDBEYOND'. Poiché sono non numerici, salvano tutto. Grazie per il consiglio!
Connor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.