Come ottenere la cronologia di bashing condivisa tra diverse schede

19

Ho usato la risposta nel link per abilitare la cronologia condivisa in tempo reale tra terminali bash separati. Come spiegato nella risposta sopra, ciò si ottiene aggiungendo:

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Funziona bene se le shell di bash sono separate (ad esempio, aprendo diversi terminali bash usando CTRL+ALT+T . Tuttavia non funziona se uso tabs (da un terminale aperto 'CTRL + MAIUSC + T) piuttosto che nuovo Windows Perché questa differenza di comportamento? Come posso condividere la cronologia di bash anche tra le varie schede?

UPDATE: Ho notato un comportamento insolito: se scrivo CTRL+C , viene visualizzato correttamente l'ultimo comando digitato in uno degli altri terminali (sia una scheda che non). È come se CTRL + C costringesse a svuotare la cronologia in modo tale da essere condivisa correttamente.

Ad esempio le uscite (T1 indica il terminale 1 e il terminale T2 2):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

Spero che questo possa offrire qualche suggerimento!

    
posta lucacerone 23.06.2013 - 20:25

4 risposte

2

Sembra che tu stia cercando di accedere alla cronologia dell'altro terminale prima che la sincronizzazione abbia luogo. PROMPT_COMMAND viene eseguito immediatamente prima della stampa di un nuovo prompt, ad esempio dopo viene eseguito un comando e prima di digitare il comando successivo. Quindi non accadrà subito in T1; devi far apparire un nuovo prompt.

Per provare questo, prova questa variante sui tuoi passi (ho aggiunto un extra <enter> in T1):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

Con questa ulteriore pressione di invio, ottieni un nuovo prompt, che esegue PROMPT_COMMAND e sincronizza la cronologia, quindi mi aspetto che questa freccia su recuperi cd invece di ls , come volevi . Sfortunatamente, non penso che esista un modo per far sì che la sincronizzazione avvenga istantaneamente in tutti i terminali senza eseguire alcun comando come sembra; in pratica ciò richiederebbe che tutte le sessioni di login continuassero a sincronizzare i propri elenchi cronologici continuamente, il che sarebbe un enorme spreco di CPU e velocità effettiva del disco.

    
risposta data Paul 28.06.2013 - 22:08
1

Ho fatto la stessa domanda ed ecco la risposta che ho trovato ...

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "[email protected]"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync
    
risposta data Scott Goodgame 26.06.2013 - 12:38
1

aggiungi le righe al tuo file .bashrc

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" $1)}'; $PROMPT_COMMAND"

nota:

Inizialmente ho eseguito il test bay inviando il segnale USR1 a bash con killall, in seguito ho pensato di utilizzare un nome shell univoco, una copia bash di nome testshell, per evitare di uccidere le mie shell che potrebbero essere eseguite (processi cron per esempio) ma stranamente non funzionava.

Il killall non era abbastanza selettivo, l'ho sostituito con uno script che uccide solo i processi bash stretti a un tty ( ps a riporta solo i processi legati a un tty)

Non dimenticare di riavviare la sessione per avere un nuovo PROMPT_COMMAND, quando stavo testando ho visto molti dei miei test precedenti impilati all'interno di PROMPT_COMMAND.

    
risposta data Emmanuel 01.07.2013 - 19:46
0

Ho avuto lo stesso strano comportamento in Yakuake quando ho provato a creare un prompt di bash elaborato che mostrava il numero di altri accessi. Il numero non è aumentato per le schede. La mia soluzione era di dire a Yakuake di eseguire nuovamente bash in ogni nuova scheda, essenzialmente iniziando bash in bash. Ha iniziato a funzionare in modo impeccabile. Potrebbe essere anche per te. La mia ipotesi cieca è che la GUI per la console carica bash le configurazioni e poi le invia alle istanze di bash. Può essere che sia in grado di giocherellare con loro.

    
risposta data Barafu Albino 26.06.2013 - 12:41

Leggi altre domande sui tag