Notes on bash history

There are three totally wonderful things you can do to enhance the
utility of your .bash_history file. Add this block to your .bashrc:

  # Keep 10,000 commands worth of history
  export HISTSIZE=10000
  
  # Make 10,000 lines more awesome by erasing duplicate commands
  export HISTCONTROL=erasedups
  
  # Don't lose command history from across many sessions
  shopt -s histappend

By itself, the last option appends that particular bash process’ history
to .bash_history at the end of the session. But combined with the
HISTCONTROL option, it’s more like an intelligent ‘merge’ than a
senseless append. Neato! Recursive searches with Ctrl + r will be
much better from now.

Other stuff you could do

To see your history file, you can either vi it like a caveman, or be a
hip 80s dude by issuing this:

  history

Here’s sample (truncated) output:

  873  cat smbd.log
  874  service smb status
  875  netstat -tulpn
  884  find /media/pool02/asap -type d | sort | grep '\<[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}T[0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{2\}\>'
  891  eval ssh tigris "df -h" | grep -c / | sed "s/./ &/g"
  902  date

Now I can just run that long find command by merely issuing:

  !884

You can actually merge histories across two or more ‘live’ sessions by
hand:

  history -a; history -n

I’ve read of people having this happen automagically by setting the
PROMPT_COMMAND variable to the snippet above. Setting this variable
executes its value before each new prompt.

  PROMPT_COMMAND="history -a; history -n"
  • history -a appends local history changes to .bash_history
  • history -n fetches changes from .bash_history

This has not worked for me on CentOS; YMMV.

Clearing History

  history -c && rm -f ~/.bash_history

This is because bash stores history in memory and in a file.

History with Timestamps

export HISTTIMEFORMAT="%F %T "