Is there a way to define an unlimited history in Bash ?
Add this to your
.bashrc (Linux) or
export HISTFILESIZE= export HISTSIZE=
There you go, unlimited history. Currently I have 27000 entries :)
HISTFILESIZEis not set, no truncation is performed.
.bash_history is never truncated
Also the same seems to apply to
HISTSIZE, although I couldn't find that documented.
Another neat feature I'm going to try is this:
HISTTIMEFORMATvariable is set, time stamps are written to the history file, marked with the history comment character, so they may be preserved across shell sessions, like the following:
export HISTTIMEFORMAT="%F %T "
Let me know if you have tried that already...
After many large, ugly iterations and weird edge cases over the years, I now have a concise section of my .bashrc dedicated to this.
First, you must comment out or remove this section of your .bashrc (default for Ubuntu). If you don't, then certain environments (like running
screen sessions) will still truncate your history:
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) # HISTSIZE=1000 # HISTFILESIZE=2000
Second, add this to the bottom of your .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"
Note: every command is written immediately after it's run, so if you accidentally paste a password you cannot just "kill -9 %%" to avoid the history write, you'll need to remove it manually.
Also note that each bash session will load the full history file in memory, but even if your history file grows to 10MB (which will take a long, long time) you won't notice much of an effect on your bash startup time.
Include in ~/.bashrc:
# append a session's history on shell exit shopt -s histappend export HISTFILESIZE= export HISTSIZE=
This answer satisfies the following criteria:
a separate master history (no session can interrupt your history)
automatic history writing (no hotkeys)
infrequent writes (no appending after each command)
On interactive startup, if
$HISTFILESIZE is set to a number, bash truncates
$HISTFILE to that number. On interactive close, if the shell option
histappend is set, bash appends
$HISTSIZE lines to
$HISTFILE, otherwise it overwrites
tips for OSX (Terminal)
Every time a tab is created in Terminal,
~/.bash_profile is read, which means bash doesn't go on to read your
~/.bashrc. Add the following line to your
# if bashrc has content, source it [[ -s ~/.bashrc ]] && . ~/.bashrc
tips for screen
If you use screen, your configuration file is ~/.screenrc. If you want screen to record history, you just need to set it to use a login shell which will source your bash startup files (and record your history).
# use bash, make it a login shell defshell -bash
A different concept (may not be applicable) but you can have
unlimited history when using shell-sink.