Supplementary Command-History Logging in Bash: Tracking Working Directory, Dates, Times, etc.

Introduction

Here is a way to create a secondary shell history log (i.e., one that supplements the primary “~/.bash_history”) that tracks a range of other information, such as the working directory, hostname, time and date etc. Using the “HISTTIMEFORMAT” variable, it is in fact possible to store the time and date with the primary history, but the storing of the other information is not as readibly do-able. Here, I present an approach based on this excellent post on StackOverflow. The main differences between this approach and the original is:

  • I remove the option to log the extra information to the primary history file: I prefer to keep this history clean.
  • I add history number, host name, time/date stamp etc. to the supplementary history log by default.
  • I add field separators, making it easy to apply ‘awk’ commands.

The (Supplementary) History Logger Function

First, add or source the following to your “~/.bashrc“:

Activating the Logger

Then you need to set this function to execute on every command by adding it to your “$PROMPT_COMMAND” variable, so you need the following entry in your “~/.bashrc“:

    export PROMPT_COMMAND='_loghistory'

There are a number of options that the logging function takes, including the adding terminal information, the adding of arbitrary text or the execution of a function or function(s) that generate appropriate text. See the function documentation for more info.

Add Some Useful Aliases

Add the following to your “~/.bashrc“:

# dump regular history log
alias h='history'
# dump enhanced history log
alias hh="cat $HOME/.bash_log"
# dump history of directories visited
alias histdirs="cat $HOME/.bash_log | awk -F ' ~~~ ' '' | uniq"

Checkout the Results! The ‘histdirs’ command is very useful to quickly list, select (via copy and pasting) and jumping back to a directory.

$ h
14095  [2011-11-23 15:36:20] ~~~ jd nuim
14096  [2011-11-23 15:36:21] ~~~ ll
14097  [2011-11-23 15:36:23] ~~~ git status
14098  [2011-11-23 15:36:33] ~~~ jd pytb
14099  [2011-11-23 15:36:36] ~~~ git status
14100  [2011-11-23 15:36:53] ~~~ git rm --cached config/*
14101  [2011-11-23 15:37:00] ~~~ git pull
14102  [2011-11-23 15:37:11] ~~~ e .gitignore
14103  [2011-11-23 15:37:28] ~~~ git status
14104  [2011-11-23 15:37:35] ~~~ e .gitignore
14105  [2011-11-23 15:37:44] ~~~ git status
14106  [2011-11-23 15:38:10] ~~~ git commit -a -m "stuff"
14107  [2011-11-23 15:38:12] ~~~ git pushall
14108  [2011-11-23 15:50:38] ~~~ ll build_c/
14109  [2011-11-23 15:53:16] ~~~ cd
14110  [2011-11-23 15:53:18] ~~~ ls -l
14111  [2011-11-23 16:00:12] ~~~ cd Documents/Projects/Phyloinformatics/DendroPy/dendropy
14112  [2011-11-23 16:00:15] ~~~ ls -l
14113  [2011-11-23 16:00:22] ~~~ cd dendropy/
14114  [2011-11-23 16:00:24] ~~~ vim *.py


$ hh
[2011-11-23 15:36:20] ~~~ /Users/jeet ~~~ jd nuim
[2011-11-23 15:36:21] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/nuim ~~~ ll
[2011-11-23 15:36:23] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/nuim ~~~ git status
[2011-11-23 15:36:33] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/nuim ~~~ jd pytb
[2011-11-23 15:36:36] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git status
[2011-11-23 15:36:53] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git rm --cached config/*
[2011-11-23 15:37:00] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git pull
[2011-11-23 15:37:11] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ e .gitignore
[2011-11-23 15:37:28] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git status
[2011-11-23 15:37:35] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ e .gitignore
[2011-11-23 15:37:44] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git status
[2011-11-23 15:38:10] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git commit -a -m "stuff"
[2011-11-23 15:38:12] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ git pushall
[2011-11-23 15:50:38] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ ll build_c/
[2011-11-23 15:53:16] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon ~~~ cd
[2011-11-23 15:53:18] ~~~ /Users/jeet ~~~ ls -l
[2011-11-23 16:00:12] ~~~ /Users/jeet ~~~ cd Documents/Projects/Phyloinformatics/DendroPy/dendropy
[2011-11-23 16:00:15] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/DendroPy/dendropy ~~~ ls -l
[2011-11-23 16:00:22] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/DendroPy/dendropy ~~~ cd dendropy/
[2011-11-23 16:00:24] ~~~ /Users/jeet/Documents/Projects/Phyloinformatics/DendroPy/dendropy/dendropy ~~~ vim *.py

$ histdirs
/Users/jeet
/Users/jeet/Documents/Projects/Phyloinformatics/nuim
/Users/jeet/Documents/Projects/Phyloinformatics/pytbeaglehon
/Users/jeet
/Users/jeet/Documents/Projects/Phyloinformatics/DendroPy/dendropy
/Users/jeet/Documents/Projects/Phyloinformatics/DendroPy/dendropy/dendropy

Further Reading

Share