Salvare la cronologia bash da più Konsole non funziona correttamente


9

Uso più terminali Konsole. E voglio che tutti i comandi che scrivo in ogni terminale vengano salvati nella cronologia dei comandi, in modo che la prossima console che apro li abbia tutti. Per evitare che ogni terminale sovrascriva la cronologia dei comandi dell'altro terminale, nel mio ho fornito le seguenti impostazioni.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

Ho dato l'ultima riga per vedere il numero del comando nel mio prompt. Il comando n. non è mai andato oltre i 600, ma alcuni dei miei vecchi comandi stanno scomparendo dalla storia. Esistono molti comandi che vengono dati ripetutamente, ma come previsto da ignoredups, non aumenta mai il comando no nel prompt. Eppure i vecchi comandi stanno ancora scomparendo e il numero di comandi nella storia rimane sempre leggermente più di 500.

Il .bash_historyfile contiene ancora molti duplicati nonostante ignorati.

PS: l'output di eco $HISTSIZEe $HISTFILESIZEsono entrambi=1000


Aggiornamento: ho riscontrato il problema nella voce precedente a .bashrc. Basta chiamare history -ain PROMPT_COMMANDsemplicemente aggiunge l'ultimo nuovo comando al .bash_history. Quindi il ignoredupse erasedupsnon hanno alcun effetto.

Esiste un modo, posso ancora scrivere su .bash_history senza duplicati da ogni terminale? Non voglio caricare l'intera cronologia ad ogni prompt dei comandi history -re riscriverla di nuovo history -w, perché i comandi che ho emesso in un terminale appariranno anche in un altro terminale in esecuzione parallelo. Voglio che i comandi combinati appaiano solo in un nuovo terminale.

Il puzzle, il motivo per cui la mia storia è stata ridotta a 500, è risolto. Ho notato che è successo ogni volta che ho usato questa macchina. La creazione di a .bash_profilecon la seguente voce ha risolto questo problema.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Ora il mio .bashrc viene eseguito ogni volta che anch'io ssh. E la dimensione del file della cronologia ora sta aumentando monotonicamente.



No. Voglio evitare il secondo requisito nell'elenco di Oli. Non voglio che la storia dei miei diversi terminali si confonda. Fino a quando avvierò un nuovo terminale. Questo è ciò che accade naturalmente quando spengo correttamente la mia macchina. Ma a volte non è possibile un arresto corretto e, a meno che non salvi istantaneamente la cronologia, tutto andrà perso in uno spegnimento improvviso.
Indiajoe,

I suoni più o meno allo stesso modo alla domanda in arrivo sulla bug-bashmailing list un anno dopo questa domanda è stata pubblicata: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
syntaxerror

Risposte:


1

Ho concluso che non è possibile aggiungere direttamente i nuovi comandi e allo stesso tempo rimuovere eventuali duplicati. Quindi la mia soluzione è di eseguire i seguenti comandi in un attimo. o per metterlo nel mio crontab.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

Il comando precedente manterrà l'ultima occorrenza di un comando e rimuoverà tutte le altre ripetizioni sopra di esso dal file cronologico senza incasinare l'ordine.


0

È brutto, e sono sicuro che sedo awksarebbe meglio, ma ho provato a risolvere lo stesso problema aggiungendo questo nel mio .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Questo creerà un file di cronologia separato per ogni terminale che apri, tuttavia se esegui bash in bash, userà la stessa cronologia, ma non dovrebbe sovrascriverlo. Ti avvertirò con un avvertimento dalla mia esperienza. Mentre questo funziona e impedisce che la cronologia venga sovrascritta, devi grepcercare più file per cercare la cronologia che stai cercando, che a volte può richiedere molto tempo.

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.