a volte i comandi della cronologia non sono memorizzati in .bash_history


20

Ho emesso molti comandi ieri nel mio CentOS 7. Ma quando volevo recuperare questi comandi oggi, ho scoperto che non c'erano record. Quando ho aperto il file .bash_history, non riuscivo ancora a trovare i comandi che ho emesso ieri, ma ho trovato molti vecchi comandi qualche giorno fa. Perché i comandi recenti non sono stati memorizzati? Come posso aumentare la capacità della cronologia?


A volte quando il terminale viene chiuso in modo anomalo, la storia non viene salvata, è successo anche a me, ma non conosco le circostanze che causano questo comportamento
mazs

Risposte:


11

La causa più probabile che gli elementi della cronologia non vengano visualizzati non è l'impostazione HISTFILEsu nulla o HISTSIZEsu zero, è accedendo alla stessa macchina due volte ed uscendo con la seconda istanza bash (in cui hai fatto poco o niente) dopo quella in cui hai fatto molto. Per impostazione predefinita, Bash non unisce la cronologia e la seconda uscita Bash sovrascrive quella .bash_historyche è stata così ben aggiornata dalla prima uscita Bash.

Per evitare che ciò accada, è possibile aggiungere al file cronologico anziché sovrascrivere, è possibile utilizzare l' histappendopzione shell:

Se l'opzione shell histappend è abilitata (vedere la descrizione di shopt sotto COMANDI INCORPORATI SHELL di seguito), le righe vengono aggiunte al file della cronologia, altrimenti il ​​file della cronologia viene sovrascritto.

Maggiori dettagli in questa risposta tra cui l'utilizzo HISTSIZE, HISTFILESIZEe HISTCONTROLper controllare le dimensioni, i duplicati etc.


3

Per modificare l'uso dimensioni storia due variabili BASH HISTSIZE, HISTFILESIZE(in genere impostati in .bashrc).

Descrizione dalla pagina man di BASH:

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.

HISTFILESIZE Il numero massimo di righe contenute nel file cronologico. Quando a questa variabile viene assegnato 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 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.

Ad esempio, ho la seguente configurazione nel mio .bashrcfile:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

1

Ho avuto questo, ma la soluzione non era elencata qui. La causa era solo un semplice problema di copia + incolla. Stavo copiando un comando da un altro documento e avevo degli spazi bianchi extra negli appunti. Per qualche motivo ciò ha fatto sì che Ubuntu non salvasse il comando nel file della cronologia.

inserisci qui la descrizione dell'immagine

L'immagine sopra era il comando che avevo negli appunti da Google Documenti. Questo comando è stato eseguito ma è stato omesso dalla mia storia. Sono appena tornato indietro e ho selezionato il comando senza spazi bianchi e poi è comparso nella storia di bash.


5
Una delle opzioni della cronologia è ignorare (non salvare) le linee che iniziano con uno spazio. Di solito è impostato su attivo. Questo può essere modificato nel tuo .bashrc.
Studog

1

Verifica che la HISTCONTROLvariabile di ambiente non sia impostata su ignorespaceo ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Puoi modificarlo impostando il valore nel tuo ~/.bash_profileo nel tuo ~/.profilefile:

HISTCONTROL=ignoredups

Dalla bashpagina man:

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 righe che iniziano con un carattere spazio non vengono salvate nell'elenco cronologico.

Un valore di ignoredups fa sì che le righe corrispondenti alla voce della cronologia precedente non vengano salvate.

Un valore di ignorebothè una scorciatoia per ignorespaceeignoredups .

Un valore di erasedups fa sì che tutte le righe precedenti corrispondenti alla riga corrente vengano rimosse dall'elenco cronologico prima che tale riga venga salvata.

Qualsiasi valore non presente nell'elenco precedente viene ignorato.

Se HISTCONTROL non è impostato o non include un valore valido, tutte le righe lette dal parser della shell vengono salvate nell'elenco cronologico, soggetto al valore di HISTIGNORE. La seconda e le successive righe di un comando composto su più righe non vengono testate e vengono aggiunte alla cronologia indipendentemente dal valore di HISTCONTROL.

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.