I file cronologici possono essere unificati in bash?


35

Eseguo abitualmente più screensessioni sui miei desktop e server Linux.

Un problema con questo è che quando grepattraverso la cronologia dei miei comandi, trovo che ho emesso un comando in una sessione diversa, e devo staccare e ricollegare per ottenere quell'elemento della cronologia.

È possibile "forzare" le storie aggiornate in modo diverso da più sessioni per passare a una cronologia centrale?


Ho riscontrato un problema simile per cui non ero in grado di visualizzare la cronologia tra le sessioni del terminale. Risulta che il mio file ~ / .bash_history era di proprietà di root e non scrivibile. La modifica del proprietario / gruppo con il mio utente ha risolto il problema: sudo chown <utente>: <gruppo> ~ / .bash_history
mateo

Risposte:


41

Ci sono due cose che devi fare:

  1. Inserisci il comando shopt -s histappendnel tuo .bashrc. Ciò verrà aggiunto al file della cronologia anziché sovrascriverlo.
  2. Anche nel tuo .bashrc, inserisci PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"e il file della cronologia verrà riscritto e riletto ogni volta che bash mostra il prompt.

EDIT: Grazie a e-t172 per il history -ntrucco


6
Grazie per questo. L'ho migliorato ulteriormente usando PROMPT_COMMAND = "$ PROMPT_COMMAND; storia -a; storia -n". In questo modo, i comandi emessi in altre sessioni compaiono immediatamente nella cronologia della sessione corrente (bene, è necessario premere prima Invio per aggiornare la cronologia).
Etienne Dechamps,

8
Non avevo PROMPT_COMMANDdefinito in precedenza, quindi ho dovuto usare PROMPT_COMMAND="history -a; history -n"per evitare errori.
William Jackson,

1
consultare la risposta superuser.com/a/734410/250287 per la cronologia corretta dei comandi -a, -c e -r.
mtd

Solo un avvertimento per il nuovo arrivato: dopo aver usato la riscrittura della cronologia per un po ', mi sono reso conto che spesso stavo dando i comandi sbagliati; quando vedi nella riga precedente qualche comando, ti aspetti che la freccia su lo ripeti, e con questa configurazione non è più sempre il caso.
Tiago,

11

Si prega di non utilizzare history -a; history -n, non funziona come previsto e vi lascerà con molti comandi duplicati e fuori servizio nella vostra cronologia. Una soluzione che funziona generalmente come previsto è la seguente:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

L'uso di una nuova riga anziché di un punto e virgola è anche un modo breve di gestire il problema del punto e virgola mancante / duplicato con PROMPT_COMMAND.


la storia -a, -c, e quindi -r è corretta ... questa dovrebbe essere la risposta accettata
mtd

1
Non exportè necessario. Poiché si presume che vengano impostate le opzioni della shell interattiva da ~/.bashrccui viene chiamata da ogni sub shell, quindi l'ereditarietà non è necessaria.
dolmen,

C'è una buona ragione per non usare solo PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"invece?
Sei

Tale ordinamento richiederebbe di archiviare l'ultimo valore di uscita prima di eseguire i comandi della cronologia, poiché molti comandi rapidi si basano o lo visualizzano.
Adam Crane,

-1

PROMPT_COMMAND non è definito per impostazione predefinita in alcune distro. Ad esempio, è definito in Arch, ma non in Debian.

Ho un bashrc nel mio Dropbox che utilizzo durante il distro hopping e include:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

Una soluzione terribile a un problema di programmazione di base della shell. Nel modo giusto:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen,

Meglio:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen
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.