È possibile rendere immediata la scrittura su .bash_history?


125

Apro spesso un sacco di terminali [In questo momento ne ho 7 aperti su questo spazio di lavoro] e spesso cerco historycon grepun comando per trovare un comando che ho appena scritto di recente, ma non voglio dare la caccia al terminale e quindi scorrere verso l'alto e cercarlo di più, ecc. A volte i miei terminali si chiudono senza "uscita" e tutto ciò che ho scritto è perso [A volte ho bisogno di qualcosa che avevo scritto in un terminale che è stato ucciso].

Quindi c'è un modo per farlo in modo che ogni terminale scriva immediatamente su .bash_history? o almeno una volta al minuto o qualcosa del genere?


2
Normalmente utilizzo la control-rricerca inversa nella cronologia dei comandi di un bash. Più conveniente rispetto a history | grepmeno che non sia necessario un regex.
Peter Cordes,

Risposte:


93

Una soluzione semplice come dettagliato nella cronologia dei Bash di aggiornamento in tempo reale .

Dice di mettere quei comandi nella configurazione .bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

Il primo comando modifica la .historymodalità file da aggiungere. E il secondo configura il history -acomando da eseguire ad ogni prompt della shell. La -ascrive immediatamente le attuali nuove linee / al file di storia.

Correlato per zsh:


1
bene questo tipo di lavori. Ho provato altri test e sembra funzionare solo sul primo comando. funziona correttamente per te?
Matt,

55

Prova a metterlo nel tuo .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Credito qui: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -ccancella la cronologia della sessione in esecuzione. Ciò ridurrà il contatore della cronologia della quantità di $HISTSIZE. history -rleggi il contenuto $HISTFILEe inseriscilo nella cronologia della sessione corrente. Ciò aumenterà il contatore della cronologia della quantità di righe in $HISTFILE.

Penso che significhi che i comandi sono disponibili quasi immediatamente (hai un terminale, scrivi echo 1, secondo terminale echo 2, prima echo 3e premendo due volte la freccia verso il basso, dovresti avere a echo 2disposizione. Devi emettere un comando in un dato terminale per avere accesso a ciò che ha stato scritto.


Brillante! Grazie. Mi chiedo perché quelle opzioni non siano documentate in man history...
artfulrobot,

10
@artfulrobot: questo comando è bashintegrato, quindi è descritto in man bash. Puoi anche usare help history.
pabouk,

2
Il mio zsh è configurato per funzionare in questo modo: ogni shell tiene traccia della propria PROPRIA cronologia (e prima ancora, della cronologia combinata) e ogni comando viene aggiunto alla cronologia combinata. Questo è diverso e migliore del ricaricare sempre la cronologia per ogni comando per ogni shell, perché tendo ad avere un "thread di lavoro" o "lavoro" diverso per ciascun terminale di shell. Penso che questa sia la differenza tra questo con -re il -ccontrario -a.
Steven Lu,

Quindi cosa stai usando esattamente? history -c; history -r? Immagino sia meglio per te, sarebbe meglio per me solo a volte, uso spesso diverse shell per fare un lavoro, quindi preferisco avere la storia il più possibile combinata. In realtà mi dispiace che il comando sia scritto nella storia solo al termine. in genere, quando avvio una sessione ssh su un host e voglio aprirne un'altra mentre la prima è ancora in esecuzione, devo riscriverla perché non è stata ancora scritta nella cronologia.
sup

Penso di non essermi mai fermato abbastanza a lungo da capire come fare in modo che bash seguisse simultaneamente i thread paralleli della storia (per ogni istanza della shell) mentre scrivevo immediatamente la storia nel file della cronologia principale. Zsh rende molto più facile farlo, inoltre ho definito una funzione zsh per scrivere molti fantasiosi metadati in un file con cronologia avanzata del mio progetto. È diventato piuttosto indispensabile. Ad ogni modo, il meccanismo è precmd () e preexec () per zsh che vengono inviati args descrivendo il comando inserito. Diventa quindi banale dirigerlo verso i file. history -apotrebbe bastare
Steven Lu

38

Ho un grande file di cronologia con circa 100000 voci e le varianti che cancellano l'elenco della cronologia e leggono l'intero file di cronologia (usando history -ce history -r) introducono un notevole ritardo (forse 0,2 secondi) prima che venga visualizzato il prompt. L'uso in history -nmodo che solo le nuove righe vengano lette dal file cronologico sia più veloce:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND non deve essere esportato perché è una variabile di shell.


Brillante! Niente più cronologia persa quando la connessione viene interrotta!
Tobia,

Questo è meraviglioso. Aggiungendo il file e leggendolo dal file, condividerà la cronologia su più terminali.
Wisbucky,

3

Una nota per tutte le altre risposte (che sono sostanzialmente la stessa cosa):

L'impostazione PROMPT_COMMAND="history -a;$PROMPT_COMMAND"in .bashrc(o amici) è sufficiente.

Inoltre, è possibile eseguire manualmente history -aogni volta che si desidera "snapshot" la cronologia nella sessione corrente.

Il comando shopt -s histappendnon è necessario perché history -aaggiunge sempre nuove righe al file e non lo sovrascrive mai. Inoltre, almeno a partire da Bash 4, histappendè il comportamento predefinito.


Sul mio mac 10.13.6 sembrava che non funzionasse senza il shopt -s histappend. Nota anche che l'ho aggiunto al mio~/.bash_profile
ubershmekel il

Probabilmente c'è un'altra impostazione da qualche parte nel tuo sistema che è disabilitata histappend, poiché quello è il comportamento predefinito. Vorrei cercarlo, ma non ho accesso a un Mac.
Guss,
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.