704

In the terminal, I can type Ctrl + R to search for a matching command previously typed in BASH. E.g., if I type Ctrl + R then grep, it lists my last grep command, and I can hit enter to use it. This only gives one suggestion though. Is there any way to cycle through other previously typed matching commands?

0

4 Answers 4

933

If I understand the question correctly you should be able to cycle through alternatives by repeatedly hitting Ctrl + R.

E.g.:

  • Ctrl + R
  • grep
  • Ctrl + R
  • Ctrl + R ...

That searches backwards through your history. To search forward instead, use Ctrl + S, but you may need to have set: stty -ixon (either by .bash_profile or manually) prior to that to disable the XON/XOFF feature which takes over Ctrl + S. (More details here.)

10
  • 27
    +1 -- FYI -- you can also search forward as per this StackOverflow answer. Apr 24, 2013 at 21:14
  • 14
    And use Ctrl+Shift+r for reverse scrolling if you happen to pass over.
    – wiswit
    Nov 1, 2015 at 13:41
  • 43
    @wiswit CTRL+SHIFT+r doesn't work for me. Apr 5, 2016 at 7:48
  • 15
    @MaximSuslov See this question: stackoverflow.com/questions/791765/… You can add [[ $- == *i* ]] && stty -ixon to your .bashrc and then CTRL+s will work as the reverse of CTRL+r
    – gla3dr
    Apr 21, 2016 at 17:03
  • 13
    @JordanArseno I took "search forward" to mean "search for commands I have not yet typed" Jul 28, 2016 at 22:10
315

If you feel the command will be used frequently, you could add a tag

command #useful

Then

Ctrl + R #useful

This works because # is a comment delimiter, i.e. everything that comes after the symbol is not interpreted as a command. However, it will be recorded in the history and is thus searchable.

7
  • 8
    Usually I do like this kind of tagging. #trg_bld #open_log
    – Makesh
    Jul 31, 2015 at 5:50
  • 2
    where to add this tag? Nov 3, 2016 at 13:46
  • 8
    @SudipBhandari just after your command. # starts a comment. E.g. ls -lah #useful
    – Andrei
    Dec 4, 2016 at 9:27
  • 25
    Unix had hashtags before it was cool :))) Oct 11, 2019 at 11:44
  • 4
    That's more a hack, and .bash_history gets flushed after a while. You'd be more comfortable using bash aliases
    – Nino Filiu
    Dec 11, 2020 at 13:56
66

You can also set up the up and down arrows to do a slightly different search by adding these lines to ~/.inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Instead of searching for a substring anywhere in the command (like Ctrl-r) it will search for a command starting with the text to the left of the cursor. For example, if I run these commands:

$ ls bart
$ ls fools

then type ls and press Up twice, it will show ls bart and the cursor in the same place. Compare with Ctrl-r, where it would find the ls twice in the last line, so you'd have to press it once again to find the previous line.

These approaches both have their strengths, and both of them can save a lot of time.

5
  • 4
    This is also standard on OS X, so you don't need to create ~/.inputrc and add those two lines.
    – DASKAjA
    Aug 12, 2016 at 14:36
  • 1
    As falconepi have written in the comments of this answer, on Ubuntu you just need to uncomment in ~/.inputrc the two lines including history-search-* Aug 16, 2016 at 7:11
  • You could also look at this post for more details on this answer: codeinthehole.com/writing/…
    – Andrei
    Dec 4, 2016 at 9:48
  • 2
    This wasn't standard on my macOS (10.13). I've always missed this functionality!
    – forthrin
    Mar 30, 2018 at 11:02
  • 1
    a good thing about this is that you can still use ctrl-p/ctrl-n for regular skimming through history
    – elig
    Sep 19, 2018 at 2:46
17

There's a replacement for built-in Ctrl + R called hstr. It allows to search command history matching all search tokens at the same time (among other things), and cycle through result using arrow keys:

Example

Here's is a demo screencast.

It can be installed on a Debian-family OS like:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

And then use Ctrl + R (after reopening the terminal).

2
  • 1
    This MUST be the accepted answer in my view. Thank you!
    – Nam G VU
    Oct 27, 2020 at 0:13
  • Awesome, working!!! Mar 1 at 12:14

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