Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I routinely run multiple screen sessions on my Linux desktops and servers.

A problem with this is that when I grep through my command history, I find I issued a command in a different session, and have to detach and re-attach to get that history item.

Is it possible to 'force' the differently-updated histories from multiple sessions to all go to a central history?

share|improve this question
    
I ran into a similar issue whereby I was not able to view history between terminal sessions. Turns out my ~/.bash_history file was owned by root and not writable. Changing owner/group to my user fixed the issue: sudo chown <user>:<group> ~/.bash_history – mateo Nov 25 '11 at 13:14
    
similar: stackoverflow.com/questions/103944/… – lesmana Dec 3 '11 at 9:20
up vote 38 down vote accepted

There are two things you need to do:

  1. Insert the command shopt -s histappend in your .bashrc. This will append to the history file instead of overwriting it.
  2. Also in your .bashrc, insert PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n" and the history file will be re-written and re-read each time bash shows the prompt.

EDIT: Thanks to e-t172 for the history -n trick

share|improve this answer
6  
Thanks for this. I improved it further using PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n". This way, commands issued in other sessions immediately appear in the history of the current session (well, you need to press Enter first to update the history). – e-t172 Sep 8 '09 at 10:41
1  
This is wonderful! Thanks for the tip! – Anthony Giorgio Sep 10 '09 at 12:27
6  
I didn't have PROMPT_COMMAND defined previously, so I had to use PROMPT_COMMAND="history -a; history -n" to avoid errors. – William Jackson Jun 2 '11 at 14:53
1  
please see the superuser.com/a/734410/250287 answer for the correct history -a, -c, and -r commands. – mtd Dec 16 '14 at 3:16
    
Just an alert to the newcomer: after using history rewriting for a while, I realized that I was often issuing the wrong commands; when you see in the previous line some command, you expect up arrow to repeat it, and with this config it is no longer always the case. – Tiago Mar 14 '15 at 15:37

Please don't use history -a; history -n, it does not work as you expect and will leave you with many duplicate, out of order commands in your history. A solution that works generally as expected is the following:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Using a newline instead of a semicolon is also a short way of dealing with the missing/duplicate semicolon problem with PROMPT_COMMAND.

share|improve this answer
    
history -a, -c, and then -r is correct...this should be the accepted answer – mtd Dec 16 '14 at 3:15
1  
The export is not necessary. Because interactive shell options are supposed to be set from ~/.bashrc which is called from every sub shell, so inheritance is not necessary. – dolmen Mar 30 '15 at 14:00
    
Is there a good reason not to just use PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" instead? – Six Jun 3 at 8:52
    
That ordering would require one to store the last exit value before running the history commands, since many prompt commands rely on or display it. – Adam Crane Jun 3 at 13:49

PROMPT_COMMAND is not defined by default in some distros. For example, it is defined in Arch, but not in Debian.

I have a bashrc in my Dropbox that I use while distro hopping, and it includes:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"
share|improve this answer
    
An awful solution to a basic shell programming problem. The right way: PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n" – dolmen Mar 30 '15 at 13:56
    
Better: PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n' – dolmen Mar 30 '15 at 14:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .