Soluzione 1:
Per capire il comportamento della cronologia di bash devi prima sapere quanto segue:
- C'è la cronologia nel file della cronologia.
- 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 qualsiasi altro processo bash.
- La cronologia nella memoria di un processo bash non è sincronizzata con la cronologia nel file, a meno che non venga esplicitamente richiesto o durante qualche evento specifico (vedi sotto).
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 il normale utilizzo viene manipolata solo la cronologia in memoria.
- Durante lo spegnimento, la cronologia in memoria viene scritta nel file della cronologia, sovrascrivendo qualsiasi contenuto precedente del file della cronologia.
Il comportamento apparentemente non deterministico che hai osservato è principalmente dovuto al fatto che il contenuto del file della cronologia è sempre la cronologia dell'ultima sessione bash chiusa e bash legge solo il file della cronologia durante l'avvio.
Leggi il manuale di bash per una spiegazione più dettagliata del processo di avvio e spegnimento.
Nota che con impostazioni predefinite intendo le impostazioni predefinite da bash. La tua distribuzione potrebbe aver fornito un .bashrc
(o /etc/bash.bashrc
) che modificano questo comportamento.
Abilitando l'opzione della shell histappend
puoi dire a bash di aggiungere invece di sovrascrivere il file della cronologia. Puoi abilitare histappend
utilizzando il comando shopt -s histappend
. Per avere questa opzione sempre abilitata devi inserire il comando nel tuo .bashrc
(o altro file di inizializzazione). Ulteriori informazioni sul shopt
comando nel manuale di bash
Nota che l'abilitazione di histappend
non ridurrà di molto il comportamento apparentemente non deterministico. Questo perché ogni sessione bash ha ancora la propria storia in memoria. È possibile avere una cronologia bash per lo più sincronizzata. C'è una guida su come fare in modo che ogni processo bash abbia una cronologia per lo più sincronizzata in un thread su overflow dello stack.
usando il comando integrato history
puoi dire esplicitamente a bash di leggere la cronologia dal file alla memoria o di scrivere dalla memoria al 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 lo spegnimento. Ulteriori 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 su cui scrivere la cronologia.HISTFILESIZE
:il numero massimo di righe per il file di cronologia.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.
Soluzione 2:
http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
Potresti essere in grado di manipolare il modo in cui viene scritto il file della cronologia con uno dei terminali, ovvero eseguire "history -a" o "history -w" nel terminale in cui desideri salvare la cronologia, quindi "history -r" in gli altri terminali. Dipende da cosa vuoi fare.