Per capire prima il comportamento della storia di bash devi sapere quanto segue:
- C'è la cronologia nel file cronologico.
- C'è la storia nella memoria di un processo bash.
- La cronologia nella memoria di un processo bash non è sincronizzata con la cronologia nella memoria di nessun altro processo bash.
- La cronologia nella memoria di un processo bash non è sincronizzata con la cronologia nel file, a meno che non sia esplicitamente richiesto o durante un evento specifico (vedere di seguito).
Utilizzando le impostazioni predefinite, il ciclo di vita di una sessione bash per quanto riguarda la cronologia è il seguente:
- Durante l'avvio bash leggerà il file della cronologia. Il contenuto del file della cronologia è ora nella memoria del processo bash.
- Durante l'uso normale viene manipolata solo la cronologia in memoria.
- Durante l'arresto la cronologia in memoria viene scritta nel file cronologico, sovrascrivendo qualsiasi contenuto precedente del file cronologico.
Il comportamento apparentemente non deterministico che hai osservato è principalmente perché il contenuto del file di cronologia è sempre la cronologia dell'ultima sessione di bash chiusa e bash legge il file di cronologia solo all'avvio.
Leggi il manuale di bash per una spiegazione più dettagliata del processo di avvio e spegnimento.
Si noti che con le impostazioni predefinite intendo le impostazioni predefinite di bash. La tua distribuzione potrebbe aver fornito un .bashrc
(o /etc/bash.bashrc
) che modifica questo comportamento.
Abilitando l'opzione shell histappend
puoi dire a bash di aggiungere invece di sovrascrivere il file della cronologia. Puoi abilitare histappend
usando il comando shopt -s histappend
. Per avere questa opzione sempre abilitata devi inserire il comando nel tuo .bashrc
(o altro file di inizializzazione). Maggiori informazioni sul shopt
comando nel manuale di bash
Si noti che l'abilitazione histappend
non ridurrà di molto il comportamento apparentemente non deterministico. Questo perché ogni sessione di bash ha ancora la sua storia in memoria. È possibile avere una cronologia bash per lo più sincronizzata. C'è una guida su come ottenere che ogni processo bash abbia una cronologia per lo più sincronizzata in un thread su overflow dello stack .
usando il comando incorporato history
puoi dire esplicitamente a bash di leggere la cronologia da file a memoria, o di scrivere da memoria a file. Ad esempio: history -r
leggerà il contenuto del file e lo aggiungerà alla cronologia in memoria. history -w
scriverà la cronologia corrente dalla memoria al file, sovrascrivendo il contenuto precedente. Questo è fondamentalmente ciò che accade durante l'arresto. Maggiori informazioni sul history
comando nel manuale di bash
Per completezza ecco un elenco delle variabili interne che modificano il comportamento della cronologia:
HISTFILE
: il file da cui leggere e scrivere la cronologia.
HISTFILESIZE
: il numero massimo di righe per il file cronologico.
HISTSIZE
: il numero massimo di righe per la cronologia in memoria.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: Non rilevante per questa discussione. Leggi il manuale di bash per i dettagli.