Come posso conservare la mia cronologia bash attraverso le sessioni?


27

Sto lavorando su un obiettivo x86 con Fedora 9.

Ogni volta che lo riavvio, la mia cronologia torna ad un certo stato e non ho comandi che ho fatto nelle sessioni prima del riavvio.

Cosa devo modificare per avere la cronologia aggiornata che avevo prima del riavvio?


Sta chiedendo "Come posso mantenere la mia storia bash attraverso le sessioni?", Che è legato alla programmazione della shell. Il riavvio è un modo drammatico di perdere la shell, tutto qui. Non ha bisogno di chiudere l'argomento.
Jonathan Leffler,

Un buon punto: questo probabilmente dovrebbe essere spostato su SuperUser.
BR

@Jonathan Sì, la domanda è corretta. Non ero sicuro di cosa chiedere esattamente.

Anche salvare ogni comando subito dopo che è stato eseguito, non alla fine della sessione sarà di aiuto. Questo perché se stai eseguendo due sessioni contemporaneamente, quindi senza la riga sotto, bash salverà la cronologia dalla sessione-1 (diciamo) quando è chiusa. Se la sessione-1 è in esecuzione e si desidera accedere immediatamente alla cronologia della sessione-1 all'interno della sessione-2, non sarà possibile farlo a meno che non si aggiunga la riga seguente al file .bashrc. PROMPT_COMMAND = 'history -a'
Abhinav

Risposte:


16

Quale storia? bash-storia? Se stai perdendo la cronologia bash e hai più sessioni alla volta, è perché ogni sessione sta sovrascrivendo la cronologia delle altre sessioni.

Probabilmente vuoi dire a bash di non sovrascrivere ogni volta la storia, ma piuttosto di aggiungerla. Puoi farlo modificando il tuo .bashrc per l'esecuzione shopt -s histappend.

Puoi anche aumentare le dimensioni del tuo file di cronologia esportando HISTSIZE in un numero di grandi dimensioni (è in byte, quindi 100000 dovrebbe essere abbondante).


7
HISTSIZEè il numero di comandi da ricordare, non il numero di byte.
Chris Down,

10

Sono stato colpito dallo stesso problema - ma il mio .bashrcfile di già avuto shopt -s histappende corretta HISTFILE, HISTSIZE, HISTFILESIZE.

Per me il problema era che il mio .bash_historyfile era di proprietà di root piuttosto che del mio nome utente, quindi il mio utente non poteva mai salvare in quel file all'uscita.


3
Ho appena scoperto di avere esattamente lo stesso problema con .bash_history di proprietà di root. Vorrei essermi reso conto prima di aver perso tutta la mia bella storia, ma non
importa

stesso qui - sono finiti diversi giorni di vagabondaggio :) grazie!
davka

1
sudo chmod your_user_name .bash_historyfatto! Grazie.
wij,

sudo chown user_name:user_name ~.bash_historyrisolto!
alper


2

Ho scritto uno script per impostare un file di cronologia per sessione o attività basato su quanto segue.

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

Non è necessario salvare tutti i comandi della cronologia, ma salva quelli a cui tengo ed è più facile recuperarli e passare attraverso ogni comando. La mia versione elenca anche tutti i file della cronologia e offre la possibilità di cercarli tutti.

Fonte completa: https://github.com/simotek/scripts-config/blob/master/hiset.sh


1

Ho scritto alcune righe nel mio .bashrc che realizzano quanto segue: Salva ogni sessione dopo ogni comando in un file. Ci saranno tanti file storici quanti mai hai avviato i terminali. All'avvio di un nuovo terminale a partire dal file cronologico più recente, caricare tutti i file cronologici delle sessioni precedenti nel buffer cronologico fino al raggiungimento di una soglia di conteggio delle righe.

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done

0

Vorrei assicurarmi che .bash_history esiste. In caso contrario, bash non può salvare la cronologia dei comandi da nessuna parte.

se .bash_history non esiste crealo eseguendo il tocco:

touch ~/.bash_history

questo crea semplicemente il file .bash_history vuoto nella tua home directory, che si riempirà con i tuoi comandi e dovrebbe persistere tra le sessioni.


0

La mia istanza di Ubuntu Amazon EC2 non stava salvando la cronologia. .bashrcaveva tutti i comandi richiesti come indicato in altre risposte, ma l'unica cosa che mancava era il file. Ho dovuto toccarlo per farlo funzionare.

touch ~/.bash_history

-1

3
Benvenuto in SuperUser! Includi informazioni sufficienti nella tua risposta in modo che il richiedente non debba fare clic su un collegamento esterno. Inoltre, assicurati che la tua risposta non si limiti a duplicare le risposte esistenti (che, da una rapida occhiata a quel link, sembra stia facendo).
Indrek,

//, sembra un buon articolo. Ma penso che stackexchange stia cercando di essere indipendente dalle destinazioni dei collegamenti, almeno un po '. Ti dispiace aggiungere una piccola spiegazione?
Nathan Basanese,
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.