Bash History: cronologia in memoria e su disco

24/02/23 | ~ 5 minuti

Ho notato che, almeno per quanto mi riguarda, c'era un po' di confusione con il funzionamento della Bash History, soprattutto per quanto concerne la memorizzazione della cronologia temporanea e permanente.

Come funziona

Per quanto potrebbe sembrare più logico, con la shell Bash l'elenco dei comandi digitati non viene memorizzato unicamente in un file su disco persistente (di default ~/.bash_history), ma esiste in primo luogo una history temporanea per ogni sessione (che risiede presumibilmente in RAM) di terminale o tty.

Ogni volta che si esce da una finestra di terminale o si fa il logout da una tty (e solo in questo momento se non si interviene manualmente), le voci della sessione vengono scritte su disco.
Viceversa, alla riapertura il contenuto del file su disco viene copiato nella memoria temporanea, che altrimenti risulterebbe vuota.
In questo modo si ottiene una continua sincronizzazione, ma non senza una certa ridondanza e disordine nei dati.

Shortcuts

Per muoversi tra le voci della Bash History si possono utilizzare i tasti direzionali della tastiera.
Con freccia su si accede all'ultima voce e poi si continua a muoversi indietro nella cronologia. Il tasto freccia giù subentra per navigare avanti fino all'ultimo comando digitato.

La combinazione ctrl + r permette di avviare una ricerca nella history, digitando i primi caratteri del comando impartito. Se ci sono comandi simili (che iniziano nello stesso modo), si può passare al successivo (che in realtà è antecedente) premendo di nuovo la stessa combinazione di tasti.
Quando il comando necessario verrà individuato, sarà possibile impartirlo direttamente col tasto invio o selezionarlo per eventuali modifiche con tab o freccia destra.

Boom! Sembra più facile fare tutto a mano? Non è così; divincolarsi tra comandi ripetivi è un attimo.

Per consuetudine la rappresentazione dei comandi avviene con il prefisso "$ ", che non va digitato nella shell.

Comandi

Il comando history con le sue opzioni e i suoi parametri, permette di intervenire sulla history temporanea e la sua interazione con quella archiviata su disco.

$ history Il comando base, va ad elencare le voci presenti al momento in memoria. Alcune voci possono essere presenti anche su disco.

$ history -c Svuota (-clean) la memoria della sessione, ma lascia inalterato il file su disco.

$ history -w Scrive (-write) il contenuto della memoria temporanea sul file persistente su disco (sovrascrivendone il contenuto).

$ history -a Appende (aggiunge in coda, -append ) i comandi della sessione al file su disco (senza eliminare il contenuto precedente). E` ciò che accade in una configurazione standard, alla chiusura di terminale o tty.

$history -r Legge (-read) da disco e copia in memoria. Succede all'apertura di nuove sessioni, se non ci mettete mano voi.

Variabili

Con l'uso di alcune variabili d'ambiente si personalizza il comportamento di diversi aspetti della Bash History. Le variabili indicate vanno aggiunte al file ~/.bashrc .

export HISTFILE=nomefile Il file usato per history su disco è specificato nella variabile HISTFILE, facilmente modificabile.

unset HISTFILE Uno dei modi per disabilitare l'archiviazione della history su disco.

export HISTCONTROL=ignoreboth Un filtro. I comandi doppi e quelli che cominciano con uno spazio verranno ignorati, senza essere salvati.

Un esempio

Uso (ma guarda un po'!) un approccio minimale, disabilitando la creazione del file indicato da HISTFILE e riducendo la quantità di voci presenti con i filtri di HISTCONTROL.

Se sentissi la necessità di voler archivare i comandi digitati per riaverli in una sessione futura, potrei fare così:

[user@dajelinux ~]$ dajelinux --per-approfondire

Occhio anche alla privacy...