I'm trying to prevent bash from saving duplicate commands to my history. Here's what I've got:

shopt -s histappend
export HISTIGNORE='&:ls:cd ~:cd ..:[bf]g:exit:h:history'
export HISTCONTROL=erasedups
export PROMPT_COMMAND='history -a'

This works fine while I'm logged in and .bash_history is in memory. For example:

$ history
    1 vi .bashrc
    2 vi .alias
    3 cd /cygdrive
    4 cd ~jplemme
    5 vi .bashrc
    6 vi .alias

$ vi .bashrc

$ history
    1 vi .alias
    2 cd /cygdrive
    3 cd ~jplemme
    4 vi .alias
    5 vi .bashrc

$ vi .alias

$ history
    1 cd /cygdrive
    2 cd ~jplemme
    3 vi .bashrc
    4 vi .alias

$ exit

But when I log back in, my history file looks like this:

$ history
    1 vi .bashrc
    2 vi .alias
    3 cd /cygdrive
    4 cd ~jplemme
    5 vi .bashrc
    6 vi .alias
    7 vi .bashrc
    8 vi .alias

What am I doing wrong?

EDIT: Removing the shopt and PROMPT_COMMAND lines from .bashrc does not fix the problem.

EDIT2: RE: "offtopic" tag

This is a problem with .bashrc, a shell script. My shell script is not doing what I want it to do. Ergo, this is a programming question.


It doesn't work:

export HISTCONTROL=erasedups:ignoredups
J.F. Sebastian
+1  A: 
export HISTCONTROL=ignoreboth
Robert Gamble
+2  A: 

The problem is definitely the histappend. Tested and confirmed on my system.

My relevant environment is:

$ set | grep HIST
HISTIGNORE=' *:&:?:??'
$ export HISTCONTROL=erasedups
$ shopt | grep hist
cmdhist         on
histappend      off
histreedit      off
histverify      off
lithist         off

Now that I think about it, the problem is probably with the history -a. history -w should write the current history without any duplicates, so use that if you don't mind the concurrency issues.