Gestione della cronologia di Bash con più terminali


110

Uso principalmente Terminator e di solito viene aperto con 3 finestre di terminale divise. Uso anche il terminale Gnome per vari motivi.
Mi chiedo come viene gestita la storia di bash in questo caso poiché a volte mi mancano comandi precedentemente emessi quando corrohistory

Ad esempio, il mio prompt mostra la riga della cronologia bash corrente ( \!) e se avvio Terminator con 3 finestre di terminale divise ottengo la stessa riga della cronologia (diciamo 100) su tutti i terminali. Quale cronologia verrà salvata?

Avvio anche di Gnome Terminal dopo aver usato Terminator Ottengo la linea 100 all'avvio indipendentemente da tutti i comandi emessi in Terminator


Risposte:


107

La sessione bash che viene salvata è quella per il terminale che è chiuso l'ultima volta. Se vuoi salvare i comandi per ogni sessione, puoi usare il trucco spiegato qui .

export PROMPT_COMMAND='history -a'

Per citare la manpage: "Se impostato, il valore viene eseguito come comando prima di emettere ogni prompt primario."

Quindi ogni volta che il mio comando è terminato, aggiunge l'elemento cronologico non scritto a ~/.bash_historyprima di visualizzare nuovamente il prompt (solo $ PS1).

Quindi, dopo aver inserito quella linea /etc/bash.bashrc, non devo trovarmi a reinventare le ruote o perdere secondi preziosi a riscrivere roba solo perché ero pigro con i miei terminali.

Ad ogni modo, dovrai tener conto del fatto che i comandi di diverse sessioni verranno mescolati nel tuo file di cronologia, quindi non sarà così semplice leggerlo in seguito.

Guarda anche:


non è memorizzato separatamente per diversi TTL ??
Vineet Menon,

Eccellente. Grazie per la spiegazione e la soluzione. Ho provato con export PROMPT_COMMAND='history -a; history -r'e ho ottenuto alcuni strani numeri di riga della cronologia nel terminale - dopo aver emesso alcuni salti di numero di riga della cronologia dei comandi entro il 2000 anziché 1, il che è strano ma si comporta come detto - tutta la cronologia dei terminali viene salvata.
zetah

@VineetMenon Per maggiori dettagli guarda qui . Parti interessanti: all'avvio della shell, la cronologia viene inizializzata dal file denominato dalla variabile HISTFILE (predefinito `~ / .bash_history '). [...] Quando esce una shell interattiva, le ultime righe $ HISTSIZE vengono copiate dall'elenco cronologico nel file denominato da $ HISTFILE.
jcollado,



32

Dopo più letture di man bash, uso file cronologici separati per ogni shell. Ho fatto un mkdir -m 0700 ~/.historypoi aggiunto

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

al mio ~/.bashrc. Ogni tanto mi ricordo di du -sk .historyripulirlo. È bello avere per me ogni comando che ho digitato.

Ho appena usato quanto sopra per vedere cosa stavo facendo, di recente:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
o
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(per includere il primo argomento, ad esempio sudo mountnella catena di ordinamento).


3
Perché lo assegni HISTFILESIZEdue volte?
Daniel,

2
Impostando HISTFILESIZE su 0, svuoto il buffer della cronologia e ripristino il meccanismo di salvataggio della cronologia. Quindi, imposto le dimensioni che desidero davvero e inizio a salvare la cronologia in HISTFILE. Vedi la sezione STORIA di man bash.
Waltinator,

1
c'è un modo per unire i file della cronologia per far Ctrl+rfunzionare di nuovo?
n611x007

3
Questa dovrebbe essere una nuova domanda, ma non credo sia una buona idea. Uso egrep 'whatever' .history/*(o cat .history/* | egrep 'whatever') invece, e uso Ctrl-r per cercare nella cronologia di una singola sessione. Leggi man bash-builtinsil comando cronologia. Il mio sort .history/* | uniq -c | sort -n | wc -lmostra 16033 comandi unici, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nmostra 2004 comandi unici, principalmente errori di battitura. Caricare tutto ciò nella "lista della storia" di bash non sarebbe d'aiuto.
Waltinator,

@Waltinator - So che questo è un vecchio commento, ma stai insinuando che l'impostazione di una variabile d'ambiente in qualche modo innesca un'azione immediata? quale processo raccoglierà il fatto che hai assegnato un valore 0 a HISTFILESIZE in una shell locale e poi immediatamente passare a 4096? è qualcosa di non documentato sulla gestione di alcuni nomi di variabili da parte di bash?
non sincronizzato il

8

Per mostrare historyda tutti i terminali:

Aggiungi export PROMPT_COMMAND='history -a; history -r'al tuo file .bashrc.

Fonte: http://northernmost.org/blog/flush-bash_history-after-each-command



3
Dirò che dopo un paio di mesi di utilizzo questo alla fine l'ho commentato solo di recente. È agrodolce poiché non sempre voglio vagliare gli ultimi 100 comandi solo per eseguire quello che avevo eseguito originariamente nel pannello Tmux A volte potrei avere un comando log dedicato in cui devo riavviare.
Elijah Lynn,

Una bella soluzione che offre la conchiglia è a history --merge. Lo uso da circa un anno e risolve il problema. Quando voglio la cronologia più recente di altre sessioni, eseguo semplicemente quel comando ed è immediatamente disponibile per me.
Elijah Lynn,

l'esportazione non è necessaria.
Espiazione limitata il

6

Vedi anche " mantenere la storia persistente in bash " per un'altra alternativa. Rafforza la tua richiesta di inviare tutti i comandi mai digitati in qualsiasi terminale in un file "cronologia persistente" (insieme a ciò che di solito viene fatto per il normale .history).


1
Ho inserito $$ per rendere la riga echo $$ $date_part "$command_part" >> ~/.persistent_historyQuesto prefisso le voci con i PID del loro processo bash, in modo da poter districare più storie.
Evgeni Sergeev,

La cronologia alternativa può funzionare con la ricerca cronologica CTRL-R?
massimo
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.