Risposte:
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
HISTFILESIZE
non impostato, non viene eseguito alcun troncamento.
Ciò significa che .bash_history
non è 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
HISTTIMEFORMAT
variabile è 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 ...
gdb
; se imposti una HISTSIZE
variabile, la prenderà come 0, disabilitando così completamente la dimensione della cronologia.
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 ...
(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 screen
sessioni 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.
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
.
bash --norc
troncherà nuovamente la cronologia.
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.
PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Includi in ~ / .bashrc :
# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=
Questa risposta soddisfa i seguenti criteri:
una cronologia master separata (nessuna sessione può interrompere la cronologia)
scrittura cronologica automatica (senza tasti di scelta rapida)
scritture poco frequenti (nessuna aggiunta dopo ogni comando)
All'avvio interattivo, se $HISTFILESIZE
impostato su un numero, bash si tronca $HISTFILE
su quel numero. Alla chiusura interattiva, se l'opzione shell histappend
è impostata, bash accoda le $HISTSIZE
linee a $HISTFILE
, altrimenti sovrascrive $HISTFILE
.
Ogni volta che viene creata una scheda in Terminale, ~/.bash_profile
viene 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
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
Un concetto diverso (potrebbe non essere applicabile) ma è possibile avere una unlimited
cronologia quando si utilizza shell-sink .