Procedura: cronologia Bash / shell illimitata?


83

C'è un modo per definire una cronologia illimitata in Bash?

Risposte:


82

Aggiungi questo al tuo .bashrc(Linux) o .bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

Ecco qua, storia illimitata. Attualmente ho 27000 voci :)

Da man bash:

Se HISTFILESIZEnon impostato, non viene eseguito alcun troncamento.

Ciò significa che .bash_historynon è mai troncato

Anche lo stesso sembra valere HISTSIZE, anche se non ho trovato quello documentato.

Un'altra caratteristica interessante che sto per provare è questa:

Se la HISTTIMEFORMATvariabile è impostata, i timestamp vengono scritti nel file della cronologia, contrassegnato con il carattere di commento della cronologia, quindi possono essere conservati nelle sessioni della shell, come il seguente:

export HISTTIMEFORMAT="%F %T "

Fammi sapere se l'hai già provato ...


3
Questo in realtà non funziona per molti casi e la storia di bash viene comunque troncata. Vedi la mia risposta di seguito per una soluzione più completa.
Fotinakis,

2
Attenzione: questo provoca mal di testa con gdb; se imposti una HISTSIZEvariabile, la prenderà come 0, disabilitando così completamente la dimensione della cronologia.
Matteo Italia,

2
note: non è necessario export, HISTFILESIZEè in numero di righe (non byte) e il troncamento del file di cronologia si verifica quando si imposta la variabileHISTFILESIZE (e quando la shell esce). Quindi non impostarlo due volte nel tuo file di configurazione con valori diversi ...
vaab

@vaab: se non esporto HISTFILE, non riesco a vedere ciò che il mio histfile sta usando "echo $ HISTFILE" nei subshells, quindi sebbene non sia necessario, può essere utile e non fa alcun male che io possa rilevare.
Jeff Learman,

41

(ripubblicando la mia risposta da https://stackoverflow.com/a/19533853/128597 )

Dopo molte grandi e brutte iterazioni e strani casi limite nel corso degli anni, ora ho una sezione concisa del mio .bashrc dedicata a questo.

Innanzitutto, devi commentare o rimuovere questa sezione del tuo .bashrc (predefinito per Ubuntu). In caso contrario, determinati ambienti (come le screensessioni in corso ) tronceranno comunque la cronologia:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

In secondo luogo, aggiungi questo nella parte inferiore del tuo .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Nota: ogni comando viene scritto immediatamente dopo l'esecuzione, quindi se si incolla accidentalmente una password non è possibile "uccidere -9 %%" per evitare la scrittura della cronologia, è necessario rimuoverla manualmente.

Si noti inoltre che ogni sessione di bash caricherà il file di cronologia completo in memoria, ma anche se il file di cronologia aumenta a 10 MB (il che richiederà molto, molto tempo) non si noterà un grande effetto sul tempo di avvio di bash.


4
Il file della cronologia viene troncato quando impostato HISTFILESIZE, per questo motivo è necessario rimuovere qualsiasi occorrenza di tale evento tranne quella desiderata. Verrà inoltre troncato all'uscita della shell (ma è previsto). E non dovresti aver bisogno export.
vaab,

3
@vaab Se non esporti, fare qualcosa del genere bash --norctroncherà nuovamente la cronologia.
Yongwei Wu,

1
Uso export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"per mantenere la cronologia della shell separata per sessione (in base al nome host e al nome tty). Naturalmente prima devo creare la directory ~ / hist.
Jeff Learman,

2
Tieni presente che potresti voler controllare il valore di PROMPT_COMMAND e non aggiungerlo ciecamente ripetutamente poiché ciò farà cose folli al tuo sistema. Un controllo nullo o, meglio ancora, una ricerca di espansione delle variabili della shell è probabilmente più sicuro.
dragon788,

3
Lo uso per evitare il problema @ dragon788 riferito a:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg,

9

Includi in ~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Questa risposta soddisfa i seguenti criteri:

  1. una cronologia master separata (nessuna sessione può interrompere la cronologia)

  2. scrittura cronologica automatica (senza tasti di scelta rapida)

  3. scritture poco frequenti (nessuna aggiunta dopo ogni comando)

sfondo

All'avvio interattivo, se $HISTFILESIZEimpostato su un numero, bash si tronca $HISTFILEsu quel numero. Alla chiusura interattiva, se l'opzione shell histappendè impostata, bash accoda le $HISTSIZElinee a $HISTFILE, altrimenti sovrascrive $HISTFILE.

suggerimenti per OSX (Terminale)

Ogni volta che viene creata una scheda in Terminale, ~/.bash_profileviene letta, il che significa che bash non continua a leggere la tua ~/.bashrc. Aggiungi la seguente riga al tuo ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

suggerimenti per lo schermo

Se si utilizza screen, il file di configurazione è ~ / .screenrc. Se vuoi che lo schermo registri la cronologia, devi solo impostarlo per usare una shell di login che genererà i tuoi file di avvio di bash (e registrerà la tua cronologia).

# use bash, make it a login shell
defshell -bash

3

Un concetto diverso (potrebbe non essere applicabile) ma è possibile avere una unlimitedcronologia quando si utilizza shell-sink .

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.