views:

50

answers:

3

In Matlab, there is a very nice feature that I like. Suppose I typed the command very-long-command and then a few several commands afterwards. Then later if I need the long command again, I just type very and press the up arrow key, my long command appears. It finds the last command that starts with very. I couldn't do the same in unix command line, when I try to do it, it disregards whatever I typed, and goes back to the last commands in chronological order. Is there a way to do it?

+5  A: 

In bash, hitting ctrl-r will let you do a history search:

$ echo 'something very long'
something very long
$ # blah
$ # many commands later...
(reverse-i-search)`ec': echo 'something very long'

In the above snippet, I hit ctrl-r on the next line after # many commands later..., and then typed ec which brought me back to the echo command. At that point hitting Enter will execute the command.

Mark Rushakoff
Thanks! I have another quick question, what if there are two recently used long commands starting with echo, how can I switch between the two with this method?
AgCl
@AgCl: [This blog post](http://ronny.haryan.to/archives/2005/03/14/tip-history-search-in-bash/) explains how to set up `history-search-forward` and `history-search-backward` to navigate through the history.
Mark Rushakoff
+2  A: 

You can do the same thing with "!". For example:

 $ echo "Hello"
 Hello
 $ !echo
 echo "Hello"
 Hello

However, it is generally a bad idea to do this sort of thing (what if the last command did something destructive?). If you expet you will reuse something, then I suggest you create a shell script and save it away somewhere (whenever I plan to reuse something, I create a script in ~/.local/bin).

Michael Aaron Safyan
Thanks, it's almost as close to Matlab's, but I can't see the whole command before hitting enter. I'll upvote the answer when I have enough rep.
AgCl
!echo:p will display the command (bash anyway) and you can choose to execute it or not.
Ron Ruble
@Ron, cool. Thanks.
Michael Aaron Safyan
+2  A: 

In bash this functionality is provided by the commands history-search-forward and history-search-backward, which by default are not bound to any keys (see here). If you run

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

it will make up-arrow and down-arrow search backward and forward through the history for the string of characters between the start of the current line and the point. See also this related Stack Overflow question.

SCFrench

related questions