I have searched, but not found anything on this. I am looking for a functionality in bash, using a terminal.

Way back when, I had a user on a debian system, and a friend set me up with a convenient history search feature (I believe I used tcsh then), where I would type the beginning of a previous command, hit up-arrow, and it would do a search, based on the partial string.

E.g. if my history is:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

And I type ., and press up-arrow, it would show me: ./script.pl arg1. Press it again and it would show ./script.pl, etc.

Very much like it would perform a grep on .bash_history. Is there a way to get this functionality?

up vote 175 down vote accepted

Put the following lines in your ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Lines starting with # are comments. I can't remember what is backward and what forward. Experiment with it. Maybe you have to switch backward and forward.


A bit background information:

Bash is using readline to handle the prompt. ~/.inputrc is the configuration file for readline. Note that this will also take effect in other software using the readline library, for example IPython.

Read the bash manual for more information about readline. There you can also find more history related readline commands.

To get the escape codes for the arrow keys you can do the following:

  1. Start cat in a terminal (just cat, no further arguments).
  2. Type keys on keyboard, you will get things like ^[[A for up arrow and ^[[B for down arrow.
  3. Replace ^[ with \e.
  • 1
    Great, but this solution disables the ctrl-left/ctrl-right shortcuts. – Eyal Feb 2 '16 at 14:22
  • Can anyone tell me how can I achieve the same for make – Hitesh Kumar Feb 10 '17 at 17:29
  • @lesmana, i would give extra points for the cat part alone – Mike D Nov 17 '17 at 16:50
  • Seconding @Eyal, anyone have advice on how I can have this but preserve ctrl-left/ctrl-right shortcuts? – kbrose Aug 28 at 21:59
  • 1
    To preserve all defaults add $include /etc/inputrc, preferably on the first line. – Tulio Casagrande Sep 5 at 17:38

Create a file named setup_readline.sh with mode 644 in /etc/profile.d/ with following content, login and check you preferred keys:

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

I think is the best way to do this. Mostly if you using configuration management systems such as chef, puppet, etc

And system config still untouched!

  • 2
    Oddly the ~/inputrc didn't work for me - but putting these commands into .bash_profile did. – Joe Jun 7 '15 at 18:45
  • 1
    .inputrc doesn't exist in my home folder and I prefer to have these kind of settings in .bashrc anyway so I can just carry around one file for my settings. So this is probably a better answer then accepted one. – ShitalShah Jun 4 '16 at 0:33
  • .inputrc works fabulously for me, but not after I load screen. The odd thing is, other .inputrc shortcuts work, but not these. So I use both solutions now. – Orwellophile Nov 28 '16 at 4:25
  • This is super-helpful when, for example, you log into a server to do things and are missing the heck out of these and don't want to edit and reload the ~/.inputrc on the server. – danmactough Dec 7 '17 at 20:56

Ctrl+R will give you this sort of functionality. Start typing a partial command and it will come up with old ones which you can navigate with the up and down arrows. More info: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell

  • 2
    Thanks for your reply. Yes, I have tried that, but I find it a bit... finicky. It will not allow me to scroll through commands beginning with the partial, it only shows the first. It also searches the entire command for the character, which is sort of useless. – TLP Sep 3 '11 at 12:23
  • 3
    @TLP, repeat hitting Ctrl+r – akostadinov Oct 3 '14 at 21:54

To complete lesmana's answer regarding "~/.inputrc" that I should create under my Trusty 14.04, verify/add in "~/.bashrc" (the first line already exists in my "~/.bashrc"):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

It's already explained in French in https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique.

  • 2
    This command basically instructs bash to immediately append command to history file instead of waiting for session to end. Its useful if you have lot of terminals open and don't want to loose history in one but otherwise not necessary. digitalocean.com/community/tutorials/… – ShitalShah Jun 4 '16 at 0:30
  • Beside the point, but Trusty is 14.04. 12.04 is Precise. – wjandrea Aug 28 at 22:44

Perhaps you may want to try https://github.com/dvorka/hstr which provides simple and multi-line simple filtering of Bash history which as based on a metrics (when, how often and length of commands matters) - you can use arrow keys to easily navigate the history:

enter image description here

It can be easily bound to Ctrl-r and/or Ctrl-s

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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