When I started writing this message, it had this subject...

"history -a" not working with custom $HISTFILE

...and I did not have a good solution to the problem, but it seems that I 
have one now.  I think the problem was a bug in Bash that may have been 
fixed some years ago, but on some systems (that I don't manage), I'm still 
using an old Bash, for example:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

I think some of you will be interested in my results, especially the 
section below labeled "WHAT I'M DOING NOW".

I want my Bash history to be saved continually to $HISTFILE.  This page 
seems to give fairly standard advice:


I usually have a few shells open at once working on various jobs, so to 
avoid interleaving the command histories, I define $HISTFILE in my 
.bashrc so that the filename depends on the tty:

export HISTFILE=~/.bash_history$(tty | sed 's|/|_|g')

That works to make the desired $HISTFILE.  Example:

$ tty

$ echo $HISTFILE

However, the $PROMPT_COMMAND, which is specified in the .bashrc file in 
the following ways (I tried it both ways)...

export PROMPT_COMMAND='history -a'

...is not working.  It should add every new command to the $HISTFILE 
immediately after it is executed.  Strangely, the failure of 
$PROMPT_COMMAND is no surprise given that neither of these commands add a 
line to $HISTFILE:

$ history -a
$ history -a $HISTFILE

It turns out that this does not work when $HISTFILE is empty.  I guess 
that's a bash bug.  I found this info:



I have the lines below in my ~/.bashrc file.  The if/then statement deals 
with the bash bug in a good way by creating a single cd command with a 
date stamp 1 second into the epoch (so 12/31/1969 in our time zone). 
That creates one history line and everything works after that.

One thing I'm likely to change:  Instead of using "echo" to write initial 
history commands, I'll probably make a file with a list of commands I'll 
likely want to use and call that ~/.bash_history_init, then do this 
instead of what is below:

if [ ! -s $HISTFILE ] ; then cp -fp ~/.bash_history_init $HISTFILE ; fi

# append to the history file, don't overwrite it
shopt -s histappend

# add the tty to the name of the history file
export HISTFILE=~/.bash_history$(tty | sed 's|/|_|g')
if [ ! -s $HISTFILE ] ; then echo -e "#1\ncd" >> $HISTFILE ; chmod 600 $HISTFILE ; fi

# immediately write every new command to the history file
export PROMPT_COMMAND='history -a'

# don't put duplicate lines in the history nor lines beginning with a space
export HISTCONTROL=ignoreboth

# For setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# Save 10,000 lines of history but 100,000 lines in the history file:
export HISTSIZE=10000
export HISTFILESIZE=100000

# commands to ignore and not add to history
HISTIGNORE='ls:laf:laf | less:jobs:bg:fg:history | less'

# set time format for history file display
# in saved file, it uses seconds since 1/1/1970, but those can be converted
# for viewing using this command (where 1234567890 is the date in seconds):
# date +"%F %T" -d @1234567890  or by using the "history" command.  The %t
# adds a tab character so that history | cut -f2- pumps out a simple list
# of commands with no date stamp