Last Updated: December 29, 2023
·
221K
· dotcode

The single most useful thing in bash

Create ~/.inputrc and fill it with this:

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

This allows you to search through your history using the up and down arrows … i.e. type "cd" and press the up arrow and you'll search through everything in your history that starts with "cd".

It's a little bit like ctrl-r (mentioned in many of the comments below), but anchored to the start of the line, and the arrow keys allow you to scroll back and forth between matches.

I use it when I'm looking to (for instance) call up the last ping I did (hit p, up arrow, return), whereas I use ctrl-r more like search, when I'm trying to find a command based on an argument or option that I used.

Both useful.

Other options that I find useful to add:

set show-all-if-ambiguous on

This alters the default behavior of the completion functions. If set to ‘on’, words which have more than one possible completion cause the matches to be listed immediately instead of ringing the bell. The default value is ‘off’.

set completion-ignore-case on

If set to ‘on’, Readline performs filename matching and completion in a case-insensitive fashion. The default value is ‘off’.

(as miah points out below, this is all actually Readline functionality. The title should be "Readline is the single most useful thing in everything" ;)

64 Responses
Add your response

I'll start to use it.

over 1 year ago ·

install zsh ;)

over 1 year ago ·

I guess I'm crazy enough to use fish that contains this feature by default ;-).

over 1 year ago ·

Or just use Ctrl-R !

over 1 year ago ·

as @matleclaire said, just use ctrl-r!

over 1 year ago ·

it's the pro version of "history | grep putyourcommandhere" :D thank you!

over 1 year ago ·

i think it is a middle term solution between CTRL+R and ZSH!

;)

over 1 year ago ·

This is better than [CTRL]+[R].

over 1 year ago ·

Also consider "set -o vi", for a set of vi powertools at the command line. Search history with regexes, traverse lines with vi keybindings, etc.

over 1 year ago ·

Using the arrow keys is almost as bad as using a mouse, I try to leave the homerow as little as possible. So I would just type 'cd /' then hit ctrl-r repeatedly until I find the command I want. Or more likely the first few characters of the directory I want to cd into and hit ctrl-r a few times until I have the command I want.

over 1 year ago ·

ALSO: This makes your bash complete case INsensitive... Just because nobody mentioned it explicitly(except the command itself ;).
And CTRL-R is not even close to what this does, honestly... try first.

over 1 year ago ·

@matleclaire this is not even close to CTRL-R.
What about case insensitive completion? At least on my machine CTRL-R is not helping there. Also, multiple CTRL-R are also not behaving like this.

over 1 year ago ·

This is better than ctrl + r and can be used together with zsh. win + win.

over 1 year ago ·

If you want to apply this globally put it in /etc/inputrc. On debian/ubuntu the file is already present, just un-comment the line with '"\e[5~": history-search-backward' etc and check the other nice options!

over 1 year ago ·

This is awesome!

Solved my long lasting confusion. I know ctrl+r but seems I can not search forward if I accidentally missed the command line I'm searching for. The arrow keys are more friendly.

over 1 year ago ·

Nice. I've been using this feature since I've switched to ZSH + Oh-my-zsh, where it comes enabled by default.

over 1 year ago ·

Huh! On bash it is same as using PageUp and PageDown. Type cd / and do PageUp.

over 1 year ago ·

@moiseevigor I was going to say, on Ubuntu something similar already seems to be in place! How does this differ?

over 1 year ago ·

Personally I find this annoying. At times I'll (for whatever reason) already have something typed into the prompt, and I realize I need a command from recent history, so I press up a few times. In this case I'd first have to press ctrl+a and ctrl+k to kill what I've already typed, or things would get very strange.

It's a cool feature, but it does come down to personal preference, and personally, ctrl+r is more than good enough.

It might be worth mentioning though that I use ZSH and oh-my-zsh.

over 1 year ago ·

@glitchmr not only you :)

over 1 year ago ·

zsh is for hipsters :-P

over 1 year ago ·
over 1 year ago ·

https://github.com/robbyrussell/oh-my-zsh

+

zsh history-substring-search plugin

= awesomeness in ZSH

over 1 year ago ·

@ipetepete Actually I prefer antigen, and enhancing zsh by myself :)

over 1 year ago ·

awesome tip .

over 1 year ago ·

@glitchmr I use fish as well. I feel that lots of people using zsh would love fish if they tried it.

over 1 year ago ·

This actually has nothing to do with bash and has more to do with readline. So long as your shell supports readline these features should be available.

http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

over 1 year ago ·

awesome!

over 1 year ago ·

Or just use :
alias hs="history | grep"
Save it to your .bashrc file to make it permanent.

over 1 year ago ·

mind = blow

over 1 year ago ·

OhMyZsh! is super-hipster!

over 1 year ago ·

you should really check out fish (http://ridiculousfish.com/shell/)

over 1 year ago ·

Awesome!

over 1 year ago ·

I prefer "\ep" for history-search-backward and "\en" history-search-forward. In this way, C-p retrieves the previous command from history and M-p retrieves the previous matching command from history. It makes more sense to me.

over 1 year ago ·

I used to use fish, but switched to zsh (with oh-my-zsh). The backwards compatibility does wind up making life easier and there aren't many fish features I miss.

over 1 year ago ·

Step 1: Install https://github.com/robbyrussell/oh-my-zsh

Step 2: Edit your ~/.zshrc, find the "plugins" line, and add "history-substring-search" to the end. Here's mine:

$ grep "plugins=" ~/.zshrc
plugins=(git … history-substring-search) 
over 1 year ago ·

Yeah. Start using zsh and then make your dotfiles better.

over 1 year ago ·

The problem with these configuration is it prints ;5D and ;5C when CTRL+<Left> and CTRL+<Right> are pressed instead of moving cursor to one word left and right.

over 1 year ago ·

hey, nice tip, but the cursor keeps its position at the beginng, how can I set to make the cursor locate at the end of the command when moving backwd/fwd? thanks

over 1 year ago ·

I already have the show-all-if-ambiguous and completion-ignore-case enabled in my input.rc and ctrl+r takes benefit of that.

One thing ctrl+r does differently is that you can search in the middle of your command (and not just the beginning), which I find more useful.

For example, I have way too many commands that start with cd, but if I use ctrl+r and type in the unique part of the filepath that I want, it jumps straight to the command I'm looking for.

over 1 year ago ·

The first two lines are actually useful. But the last two things will get very annoying very fast, specially if you're used to working with a Unix-type CLI often.

over 1 year ago ·

If you want CTRL+<right> and CTRL+<left> to continue working, you'll need these changes as well:

"\e[1;5C": forward-word

"\e[1;5D": backward-word

over 1 year ago ·

just get guake....

over 1 year ago ·

This was very very util ! thanks!! :D
I'm using this "bash shortcut" in my Linode, it's excellent! Thanks again

over 1 year ago ·

no way ... it is awesome

over 1 year ago ·

Neat!

over 1 year ago ·

I can understand people's love for zsh, but it doesn't help people who use Bash and just want to improve it.

two cents

over 1 year ago ·

works on bash
For csh use
bindkey -k up history-search-backward
bindkey -k down history-search-forward

over 1 year ago ·

Thanks for the tip, but I like my ups and downs the way they are. Never used ctl+r but will now!

over 1 year ago ·

Good one

over 1 year ago ·

-bash: \e[A:: command not found

on OS X, what's wrong?

over 1 year ago ·

thats totally awesome!

over 1 year ago ·

thats totally awesome!

over 1 year ago ·

thanks for sharing man

over 1 year ago ·

awsome man..

over 1 year ago ·

Its a good tip, but yeah - zsh has this and soooo much more.

over 1 year ago ·

you can get even more power with zsh zle http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html

or simply fc

over 1 year ago ·

Perhaps you could consider BASH history suggest box https://github.com/dvorka/hstr that greatly simplifies navigation through the history and its management.

over 1 year ago ·

@glitchmr

Fish has a well deserved spot in the hall of fame as far as shells go, seems valid enough to me ^^

over 1 year ago ·

This is much better than Ctrl-R. Thank you very much..

over 1 year ago ·

I still prefer ZSH, has this built in.

over 1 year ago ·

Ctrl+R is broken for me... never worked quite right :( Didn't correctly delete previous prompt when I was scrolling through history and other various glitches.

over 1 year ago ·

:+1:

over 1 year ago ·

Could do... could do... or, and I'm just tossing this out there...
"\e[A": history-substring-search-backward "\e[B": history-substring-search-forward
Which accomplishes the same thing, except if you start typing a command first and THEN hit up, it FILTERS your history to only include those commands that start with the same text as you typed. Example:

If my history reads:
echo "hello" echo "world" ls -la lsof
...and I type ec at my prompt, then hit the up arrow, it will only cycle through...
echo "hello" echo "world"
...likewise, if I typed ls at my prompt and hit up arrow...
ls -la lsof

about 2 months ago ·