Se corro history
, posso vedere i miei ultimi comandi eseguiti.
Ma se lo faccio tail -f $HISTFILE
o tail -f ~/.bash_history
, non vengono elencati.
Il file viene bloccato, esiste un percorso temporaneo o qualcosa di simile?
Se corro history
, posso vedere i miei ultimi comandi eseguiti.
Ma se lo faccio tail -f $HISTFILE
o tail -f ~/.bash_history
, non vengono elencati.
Il file viene bloccato, esiste un percorso temporaneo o qualcosa di simile?
Risposte:
Bash mantiene l'elenco dei comandi internamente in memoria mentre è in esecuzione. Sono scritti .bash_history
all'uscita :
Quando esce una shell interattiva, le ultime righe di $ HISTSIZE vengono copiate dall'elenco della cronologia nel file denominato da $ HISTFILE
Se si desidera forzare la cronologia dei comandi da scrivere, è possibile utilizzare il history -a
comando, che:
Aggiungi le nuove righe della cronologia (righe della cronologia inserite dall'inizio della sessione Bash corrente) al file della cronologia.
C'è anche -w
un'opzione:
Scrivi la cronologia corrente nel file della cronologia.
che può adattarti maggiormente a seconda di come usi la tua cronologia.
Se vuoi assicurarti che siano sempre scritti immediatamente, puoi inserire quel comando nella tua PROMPT_COMMAND
variabile:
export PROMPT_COMMAND='history -a'
(Non è una risposta ma non posso aggiungere commenti)
Se si sta verificando .bash_history
perché si desidera solo eliminare un comando specifico (ad esempio contenente una password in chiaro), è possibile eliminare direttamente la voce in memoria di history -d <entry_id>
.
Ad esempio, supponendo un output come:
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
e vuoi eliminare la export
linea, puoi semplicemente raggiungerla:
history -d 928
bash lo mantiene nella memoria di lavoro, bash può essere configurato per salvarlo quando bash si chiude o dopo ogni comando e per essere caricato all'avvio di bash o su richiesta.
Se si configura il salvataggio dopo ogni comando, considerare le implicazioni di avere più bash in esecuzione contemporaneamente. (le righe di comando saranno interfogliate)
bash
nell'esetable. Scriverei "È archiviato bash
in memoria, ..."
I comandi vengono salvati in memoria (RAM) mentre la sessione è attiva. Non appena si chiude la shell, l'elenco dei comandi viene scritto .bash_history
prima dell'arresto.
Pertanto, non vedrai la cronologia della sessione corrente in .bash_history
.
bash
termine, il che non implica il riavvio (specialmente negli ambienti grafici in cui è possibile aprire e chiudere i terminali come desiderato).
Durante l'esecuzione, la cronologia viene mantenuta in memoria (per impostazione predefinita) se:
H
in echo "$-"
) è impostato.0
e*
(o qualche altro modello molto restrittivo).Se una delle precedenti operazioni non riesce, nessuna cronologia viene archiviata in memoria e di conseguenza nessuna cronologia può o verrà scritta sul disco.
La cronologia in memoria viene scritta sul disco se:
Ma solo quando la shell esce o se vengono eseguiti i comandi history -a
(append) o history -w
(write).
Per attivare una scrittura immediata su disco è possibile utilizzare la variabile:
PROMPT_COMMAND='history -a'
quale sarà append
la new
riga della cronologia al file della cronologia. Queste sono le righe della cronologia inserite dall'inizio della sessione bash corrente, ma non già aggiunte al file della cronologia.
O:
PROMPT_COMMAND='history -w'
Per sovrascrivere la cronologia nel HISTFILE con l'elenco dalla memoria.
Quindi, puoi rimuovere un comando dalla cronologia in memoria:
$ history 5
6359 ls
6360 cd ..
6361 comand --private-password='^%^&$@#)!@*'
6362 top
6363 set +o | less
$ history -d 6361
$ history 5
6359 ls
6360 cd ..
6361 top
6362 set +o | less
$ history -w
E scrivilo su disco con l'ultimo comando:
history -w # with `shopt -u histappend` unset
.bash_history
file diventa accidentalmente di proprietà di root, le cose smettono di funzionare. In tal caso, controllare la proprietà e utilizzaresudo
per correggere la proprietà, se necessario.