Timestamp bash_history with every command

When working on Linux it is often very helpful to review the commands that you have entered.  For example, you may want to paste some of the commands into a script or may want to recreate the steps to solve the problem you were working on.

Here is how I do it:

## Modify History for Current Session
# Add Timestamp to .bash_history
HISTTIMEFORMAT="%d/%m/%y %T "
# Write Current History to .bash_history
history -a
# Update .bash_history with every command
export PROMPT_COMMAND='history -a'

## Add to .bash_profile to make changes permanent
echo 'export HISTTIMEFORMAT="%d/%m/%y %T "' >> $HOME/.bash_profile
echo "export PROMPT_COMMAND='history -a'" >> $HOME/.bash_profile   

## Save the last 10,000 lines to disk and keep 5000 lines in memory
cat $HOME/.bashrc | sed 's/#\?\(HISTSIZE\s*=\s*\).*$/\15000/' | sed 's/#\?\(HISTFILESIZE\s*=\s*\).*$/\110000/' > temp.txt
mv -f temp.txt $HOME/.bashrc
source ~/.bashrc
# See also https://www.digitalocean.com/community/tutorials/how-to-use-bash-history-commands-and-expansions-on-a-linux-vps


## From BASH_BUILTINS(1)...
# 
#       history [n]
#       history -c
#       history -d offset
#       history -anrw [filename]
#       history -p arg [arg ...]
#       history -s arg [arg ...]
#              With  no  options,  display  the  command history list with line numbers.  Lines listed with a * have been modified.  An argument of n
#              lists only the last n lines.  If the shell variable HISTTIMEFORMAT is set and not null, it is used as a format string for  strftime(3)
#              to  display  the  time stamp associated with each displayed history entry.  No intervening blank is printed between the formatted time
#              stamp and the history line.  If filename is supplied, it is used as the name of the history file; if not, the  value  of  HISTFILE  is
#              used.  Options, if supplied, have the following meanings:
#              -c     Clear the history list by deleting all the entries.
#              -d offset
#                     Delete the history entry at position offset.
#              -a     Append the ``new'' history lines (history lines entered since the beginning of the current bash session) to the history file.
#              -n     Read  the  history lines not already read from the history file into the current history list.  These are lines appended to the
#                     history file since the beginning of the current bash session.
#              -r     Read the contents of the history file and use them as the current history.
#              -w     Write the current history to the history file, overwriting the history file's contents.
#              -p     Perform history substitution on the following args and display the result on the standard output.  Does not store  the  results
#                     in the history list.  Each arg must be quoted to disable normal history expansion.
#              -s     Store  the  args  in  the  history list as a single entry.  The last command in the history list is removed before the args are
#                     added.
#
#              If the HISTTIMEFORMAT variable is set, the time stamp information associated with each history entry is written to the  history  file,
#              marked with the history comment character.  When the history file is read, lines beginning with the history comment character followed
#              immediately by a digit are interpreted as timestamps for the previous history line.  The return value is 0 unless an invalid option is
#              encountered,  an  error  occurs  while reading or writing the history file, an invalid offset is supplied as an argument to -d, or the
#              history expansion supplied as an argument to -p fails.
Tagged , . Bookmark the permalink.