Se corro history, posso vedere i miei ultimi comandi eseguiti.
Ma se lo faccio tail -f $HISTFILEo 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 $HISTFILEo 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_historyall'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 -acomando, che:
Aggiungi le nuove righe della cronologia (righe della cronologia inserite dall'inizio della sessione Bash corrente) al file della cronologia.
C'è anche -wun'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_COMMANDvariabile:
export PROMPT_COMMAND='history -a'
(Non è una risposta ma non posso aggiungere commenti)
Se si sta verificando .bash_historyperché 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 exportlinea, 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)
bashnell'esetable. Scriverei "È archiviato bashin 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_historyprima dell'arresto.
Pertanto, non vedrai la cronologia della sessione corrente in .bash_history.
bashtermine, 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:
Hin 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à appendla newriga 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_historyfile diventa accidentalmente di proprietà di root, le cose smettono di funzionare. In tal caso, controllare la proprietà e utilizzaresudoper correggere la proprietà, se necessario.