Quanto durano i contenuti del file .bash_history?


11

Come posso modificare il contenuto del mio bash_historyfile? Quali valori o variabili controllano quanto dura la storia? Ci sono altre cose che posso cambiare per fornire un controllo più preciso della mia storia BASH ??



2
Non credo che questo file sia controllato dalla durata, ma piuttosto dalle dimensioni massime del file. Vedi qui: c'è un modo per impostare la dimensione dell'elenco cronologico in bash su più di 5000 righe? . Quindi l'inv. variabili HISTSIZEe HISTFILESIZEsono le uniche superfici di controllo che devi controllare quanta cronologia viene mantenuta.
slm

Risposte:


12

Esistono due variabili che controllano le dimensioni della cronologia:

HISTFILESIZE Il numero massimo di righe contenute nel file cronologico. Quando a questa variabile viene assegnato un valore, il file cronologico viene troncato, se necessario, per contenere non più di quel numero di righe rimuovendo le voci più vecchie. Anche il file della cronologia viene troncato a questa dimensione dopo averlo scritto quando esce una shell. Se il valore è 0, il file della cronologia viene troncato a zero. Valori non numerici e valori numerici inferiori a zero inibiscono il troncamento. La shell imposta il valore predefinito sul valore di HISTSIZE dopo aver letto i file di avvio.

e

HISTSIZE Il numero di comandi da ricordare nella cronologia dei comandi (vedi STORIA di seguito). Se il valore è 0, i comandi non vengono salvati nell'elenco cronologico. Valori numerici inferiori a zero determinano il salvataggio di ogni comando nell'elenco cronologico (non vi sono limiti). La shell imposta il valore predefinito su 500 dopo aver letto tutti i file di avvio.

Queste due variabili ti consentono di controllare il comportamento della tua storia. Fondamentalmente, HISTSIZEè il numero di comandi salvati durante la sessione corrente ed HISTFILESIZEè il numero di comandi che verranno ricordati tra le sessioni. Quindi, per esempio:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

Nell'esempio sopra, perché HISTSIZE è impostato su 10, historyrestituisce un elenco di 10 comandi. Tuttavia, se ci si disconnette e quindi si accede nuovamente, historyverranno restituiti solo 5 comandi perché HISTFILESIZEè impostato su 5. Questo perché, una volta usciti dalla sessione, le HISTFILESIZErighe della cronologia vengono salvate nel file della cronologia ( ~/.bash_historyper impostazione predefinita, ma controllate da HISTFILE). In altre parole, i comandi vengono aggiunti HISTFILEfino a quando non raggiungono le $HISTFILESIZElinee in quel punto, ogni riga successiva aggiunta significa che il primo comando del file verrà rimosso.

Puoi impostare i valori di queste variabili nel tuo ~/.profile(o ~/.bash_profilese quel file esiste). Non impostarli nel tuo ~/.bashrcprimo perché non ci sono attività impostate lì e in secondo luogo perché ciò comporterebbe un comportamento diverso nelle shell di login rispetto a quelle non di accesso che possono causare altri problemi .

Altre variabili utili che ti consentono di mettere a punto il comportamento della tua storia sono:

  • HISTIGNORE: Ciò consente di ignorare alcuni comandi comuni che raramente sono di interesse. Ad esempio, è possibile impostare:

    export HISTIGNORE="pwd:df:du"

    Ciò causerebbe qualsiasi comando che inizia con pwd , dfo duessere ignorato e non salvato nella tua cronologia.

  • HISTCONTROL: Questo ti consente di scegliere come funziona la cronologia. Personalmente, l'ho impostato su HISTCONTROL=ignoredupsquale causa il salvataggio dei comandi duplicati una sola volta. Altre opzioni sonoignorespace ignorare i comandi che iniziano con uno spazio bianco e erasedupsciò fa sì che tutte le righe precedenti corrispondenti alla riga corrente vengano rimosse dall'elenco cronologico prima che la riga venga salvata. ignorebothè una scorciatoia per ignorespace e ignoredups.

  • HISTTIMEFORMAT: Ciò consente di impostare il formato dell'ora del file della cronologia. Vedi la risposta di Pandya o leggiman bash per i dettagli.


Per un'ulteriore messa a punto, hai:

  • L' histappendopzione bash. Questo può essere impostato eseguendoshopt -s histappend o aggiungendo quel comando al tuo ~/.bashrc. Se questa opzione è impostata

    l'elenco della cronologia viene aggiunto al file indicato dal valore della variabile HISTFILE all'uscita della shell, anziché sovrascrivere il file.

    Questo è molto utile in quanto consente di combinare le storie di sessioni diverse (ad esempio pensare a terminali diversi).

  • Il historycomando ha due opzioni utili:

    • history -a : provoca la scrittura automatica dell'ultimo comando nel file cronologico

    • history -r : importa il file della cronologia nella sessione corrente.

    Ad esempio, potresti aggiungere questi due comandi al tuo PROMPT_COMMAND(che viene eseguito ogni volta che la shell mostra il prompt, quindi ogni volta che avvii una nuova shell e dopo ogni comando che esegui in essa):

    export PROMPT_COMMAND='history -a;history -r;'

    Combinati, assicurano che qualsiasi nuovo terminale che apri importerà immediatamente la cronologia di qualsiasi altra sessione di shell. Il risultato è una storia comune in tutti i terminali / sessioni di shell.


2

La dimensione predefinita del file della cronologia è di 500 righe. Quando il file .bash_history raggiunge le 500 righe, le voci iniziali vengono eliminate per fare spazio alle nuove righe, come in FIFO. Puoi cambiarlo cambiando il valore della variabileHISTFILESIZE che per impostazione predefinita ha il valore 500.

Inserendo a HISTFILESIZE=10000nel tuo .bashrc aumenterai il numero di righe che il file della cronologia può contenere a 10000, aumentando così la durata del suo contenuto.


2
nota: se aumenti HISTSIZEil limite, considera di cambiare HISTFILEanche. Se corri bash --norc HISTSIZEtornerai al valore predefinito, troncando il tuo HISTFILEall'uscita.
llua

Grazie @llua. Allo stesso modo, se il tuo sistema /etc/bash.bashrcimposta un HISTFILESIZE(o forse HISTSIZE; non ho controllato quale), allora Bash sembra troncarsi .bash_historynel punto in cui legge /etc/bash.bashrc(o almeno ad un certo punto prima che il tuo nuovo limite sia impostato nei tuoi file Bash init). Per evitare ciò, imposta di nuovo la tua in HISTFILEmodo che la tua vera storia vada lì e non nel .bash_historyfile che Bash sta troncando.
Chris Povirk,

(Ma non exportfarlo, perché farlo lo renderebbe visibile a qualsiasi shell bambino, che potrebbe quindi cercare di troncarlo invece di .bash_history!)
Chris Povirk,

0

Leggi man bashper maggiori dettagli sulla storia di Bash come:

HISTCONTROL
       Un elenco di valori separato da due punti che controlla il modo in cui i comandi vengono salvati nell'elenco della cronologia.
       Se l'elenco di valori include ignorespace, le linee che iniziano con un carattere spazio sono
       non salvato nell'elenco cronologico. Un valore di ignoredups provoca righe corrispondenti alla precedente
       voce della cronologia da non salvare. Un valore di ignoreboth è una scorciatoia per ignorespace e
       ignoredups. Un valore di cancellazioni causa tutte le righe precedenti corrispondenti alla riga corrente
       essere rimosso dall'elenco cronologico prima di salvare quella riga. Qualsiasi valore non indicato sopra
       l'elenco viene ignorato. Se HISTCONTROL non è impostato o non include un valore valido, tutte le righe
       letto dal parser della shell viene salvato nell'elenco cronologico, soggetto al valore di HISTIG‐
       NORE. La seconda e le successive righe di un comando composto su più righe non vengono testate,
       e vengono aggiunti alla cronologia indipendentemente dal valore di HISTCONTROL.
HISTFILE
       Il nome del file in cui viene salvata la cronologia dei comandi (vedere la STORIA di seguito). Il predefinito
       il valore è ~ / .bash_history. Se non impostato, la cronologia dei comandi non viene salvata all'uscita da una shell.
HISTFILESIZE
       Il numero massimo di righe contenute nel file cronologico. Quando questa variabile è assegnata
       un valore, il file della cronologia viene troncato, se necessario, per contenere non più di quel numero
       di righe rimuovendo le voci più vecchie. Anche il file della cronologia viene troncato a questa dimensione
       dopo averlo scritto quando esce una shell. Se il valore è 0, il file della cronologia viene troncato
       dimensione zero. Valori non numerici e valori numerici inferiori a zero inibiscono il troncamento. Il
       shell imposta il valore predefinito sul valore di HISTSIZE dopo aver letto tutti i file di avvio.
HISTIGNORE
       Un elenco separato da due punti di modelli utilizzati per decidere su quali righe di comando devono essere salvati
       l'elenco della cronologia. Ogni modello è ancorato all'inizio della riga e deve corrispondere
       la riga completa (non viene aggiunto nessun '*' implicito). Ogni modello viene testato rispetto alla linea
       dopo l'applicazione dei controlli specificati da HISTCONTROL. Oltre alla shell normale
       caratteri corrispondenti al motivo, `& 'corrisponde alla riga della cronologia precedente. `& 'potrebbe essere evitato
       usando una barra rovesciata; la barra rovesciata viene rimossa prima di tentare una corrispondenza. Il secondo e
       le righe successive di un comando composto su più righe non vengono testate e vengono aggiunte a
       cronologia indipendentemente dal valore di HISTIGNORE.
HISTSIZE
       Il numero di comandi da ricordare nella cronologia dei comandi (vedi STORIA di seguito). Se la
       il valore è 0, i comandi non vengono salvati nell'elenco cronologico. Valori numerici inferiori a zero
       risulta che tutti i comandi vengano salvati nell'elenco cronologico (non ci sono limiti). Il guscio
       imposta il valore predefinito su 500 dopo aver letto i file di avvio.
HISTTIMEFORMAT
       Se questa variabile è impostata e non nulla, il suo valore viene utilizzato come stringa di formato per strftime (3)
       per stampare il timestamp associato a ciascuna voce della cronologia visualizzata dalla cronologia
       incorporato. Se questa variabile è impostata, i timestamp vengono scritti nel file cronologico in modo che possano
       essere preservato attraverso le sessioni della shell. Questo utilizza il carattere del commento cronologico per distinguere
       indovina i timestamp di altre linee della storia.

In particolare HISTFILESIZEe che HISTSIZEtu stia cercando e ti aiuti.

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.