5

The other night I was reading AU Q&A and used a bash command:

inxi -????

Problem is today I don't remember characters comprising ????. I want to put the command and parameters into my documentation spreadsheet. Based on an this answer (How to recall history in teminal) I used this command:

$ cat .bash_history | grep inxi
inxi -b
sudo apt install inxi
inxi -b

However the command I want isn't there even though the history goes far back. I've used the inxi commands many times in the terminal since that old history but none of is showing up.

I've also tried Ctrl+R+inxi without any luck. Because I open multiple terminal windows all the time is history tied to a specific window?

Is there a different way to grep bash history file(s)?

Note that I do not prefix terminal commands with a Space Bar such that they are supressed from history.

  • 3
    I think it's not your search methods that are flawed, but the mysterious way that some commands aren't saved when running multiple shells. The same thing annoys me plenty and if I weren't so lazy I'm sure I'd find a brilliant & highly detailed explanation for it probably written by Eliah Kagan – Zanna Feb 20 '17 at 23:05
5

I can't know what happened without access to your machine but here is a short explanation of how the history system works which might help you figure out what happened.

Each open terminal has its own history buffer. These buffers are appended to your $HISTFILE when the terminal is closed (maybe also whenever the buffer is filled, but I don't know how often that happens). Now, the way to search for a command in your history is to simply run:

history | grep command

But if the command was run in a different shell, you won't see it in the history of your current one. To fix that, you close all open shells, open a new terminal window and search your history again.

If that still doesn't help, you've probably passed the threshold of commands stored in the $HISTFILE. The behavior of the $HISTFILE is controlled by various environment variables (see man bash for the full list), but the relevant ones here are:

   HISTSIZE
          The  number  of commands to remember in the command history (see HISTORY below).  If the value is 0, commands are not saved in the history list.  Numeric values less than
          zero result in every command being saved on the history list (there is no limit).  The shell sets the default value to 500 after reading any startup files.

   HISTFILESIZE
          The maximum number of lines contained in the history file.  When this variable is assigned a value, the history file is truncated, if necessary, to contain no  more  than
          that number of lines by removing the oldest entries.  The history file is also truncated to this size after writing it when a shell exits.  If the value is 0, the history
          file is truncated to zero size.  Non-numeric values and numeric values less than zero inhibit truncation.  The shell sets the default value to the value of HISTSIZE after
          reading any startup files.

The higher values you set these to, the more commands you'll keep in your $HISTFILE. For example, I use:

HISTSIZE=999999
HISTFILESIZE=999999

If you want to import the history from one shell into another, you can use the history command:

$ help history | grep -E -- '-a|-r'
      -a    append history lines from this session to the history file
      -r    read the history file and append the contents to the history

So, run history -a to write the history from one terminal and then history -w to read it from the another. Now, running history will show you the history of both shells.

Finally, you can make all your terminals share the same history by adding these lines to your ~/.bashrc:

## history -a causes the last command to be written to the
## history file automatically and history -r imports the history
export PROMPT_COMMAND='history -a;history -r'

I also suggest you add this:

## Make Bash append rather than overwrite the history on disk:
shopt -s histappend
  • @Zanna and I were discussing this in AU general chat room after she read this question and the same things happen to her. We thought of filing a bug report but decided we were both too lazy :) I suggested we could test this by opening two terminal windows, entering commands and seeing which window updated .bash_history and which didn't. But we were too lazy to carry out experiment. I floated the idea that it's a locking issue and only one terminal gets write access to .bash_history. I like your suggestion of updating ~/.bashrc and have just done that on my machine. Thank You :) – WinEunuuchs2Unix Feb 21 '17 at 1:13
  • @WinEunuuchs2Unix The history -a and history -r commands are really useful when you want to test that sort of thing. You can run history | tail, then history -a from the other terminal, history -r from the original one and your new commands magically appear if you now run history | tail again. – terdon Feb 21 '17 at 1:17
  • Funny thing is I've often noticed history was missing when pressing Up-Arrow but today was the first time I really cared about it. Hopefully implementing your suggestions for ~/.bashrc means it won't happen again. – WinEunuuchs2Unix Feb 21 '17 at 1:20
  • I renamed the question to "Half of bash history is missing" to reflect what is really happening here. I hope you don't mind. – WinEunuuchs2Unix Feb 21 '17 at 1:22
  • @WinEunuuchs2Unix ah, hang on, you might also be hitting another problem. Did you log in from a tty recently? Although that probably won't be an issue since Ubuntu's default .profile sources .bashrc. – terdon Feb 21 '17 at 1:35
2

Your command worked for me...

$ cat .bash_history | grep inxi
inxi -b
sudo apt install inxi
inxi -b
inxi -Fxz -c 0 > inxi_list.txt
inxi -Fxz
inxi -Fxz
sudo inxi -Fxz

I also periodically copy history to a file and save it.

history > history_$(date '+%Y-%m-%d_%H:%M:%S')_$(hostname).txt
  • I like your inxi -Fxz results. I'll use that in my spreadsheet instead. Thank you :) Copying the history is a good idea, but maybe I should backup /home/$USER aka ~ sometime too. – WinEunuuchs2Unix Feb 20 '17 at 23:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.