GNU/Linux >> Linux Esercitazione >  >> Linux

Strano comportamento della cronologia di bash durante l'esecuzione di più sessioni

Soluzione 1:

Per capire il comportamento della cronologia di bash devi prima sapere quanto segue:

  1. C'è la cronologia nel file della cronologia.
  2. C'è la storia nella memoria di un processo bash.
  3. La cronologia nella memoria di un processo bash non è sincronizzata con la cronologia nella memoria di qualsiasi altro processo bash.
  4. 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:

  1. Durante l'avvio bash leggerà il file della cronologia. Il contenuto del file della cronologia è ora nella memoria del processo bash.
  2. Durante il normale utilizzo viene manipolata solo la cronologia in memoria.
  3. 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.


Linux
  1. Come cancellare la cronologia di Bash su Linux

  2. Impedire l'esecuzione simultanea di uno script bash

  3. Conserva la cronologia di Bash in più finestre di terminali?

  4. Storia di Bash:"ignoredups" e "erasedups" che creano conflitto con la storia comune nelle sessioni?

  5. Aggiorna la cronologia di Bash su altri terminali quando esci da un terminale?

Comando della cronologia in Linux (Cronologia di Bash)

Pulizia automatica della cronologia di Bash?

Aprire più schede del terminale ed eseguire il comando?

Conferma automatica durante l'esecuzione di script Bash?

Cronologia di Bash:come visualizzare un timestamp (data/ora) quando ogni comando è stato eseguito

Procedura:cronologia Bash/shell illimitata?