火曜日, 4月 29, 2014

bash - Search for a previous command with the same prefix when I press Up at a shell prompt - Unix & Linux Stack Exchange

bash - Search for a previous command with the same prefix when I press Up at a shell prompt - Unix & Linux Stack Exchange



Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.
Coming from a FreeBSD world I wish to make the Linux terminal behave like FreeBSD one, especially the 9.1 version, basically when you type cd in the terminal and push the "up" arrow you can browse all the commands in the history starting with cd which makes you gain a lot time.
I don't know how to enable this feature in Linux Debian or CentOS which force me to type the whole, could someone please help.
shareimprove this question
7 
That's a function of the shell, not the terminal. What shell are you using in FreeBSD? You may be able to get the same (or similar) shell for Linux. –  cjm Oct 17 '13 at 17:20
   
I am using the tcsh shell. –  Abdelilah Benaou Oct 17 '13 at 17:29
1 
I'm using tcsh under OS X and didn't have this handy-looking behavior… After some searching, I found I could enable it by putting bindkey -k (up|down) history-search-(back|for)ward in my .tcshrcas described here. Cool! –  Garrett Albright Oct 17 '13 at 20:27
add comment
Add to the following to ~/.inputrc:
# Press up-arrow for previous matching command
"\e[A":history-search-backward
# Press down-arrow for next matching command
"\e[B":history-search-forward
Explanation
~/.inputrc is the configuration file for GNU readline. Many shells, including bash and tcsh use readline for command line editing. The two lines above will tell readline to invoke its history search functionality when the escape sequences for the up-arrow key (\e[A) and down-arrow key (\e[B) are encountered.
shareimprove this answer
1 
Thank you that's the real deal, hat off mate. –  Abdelilah Benaou Oct 17 '13 at 17:31
1 
You're welcome. –  Thomas Nyman Oct 17 '13 at 17:34
add comment
What's happening is that FreeBSD and Linux use different shells by default. FreeBSD defaults totcsh, which had better interactive features than bash in the past (but bash has caught up) butmarkedly worse scripting features.
The most straightforward way to get the environment you're used to would be to switch your shell to tcsh on Linux. Provided that tcsh is installed system-wide (if it isn't, ask your system administrator to install it), run chsh -s tcsh to change your default shell.
Alternatively, you can set up bash to have this command you're used to. By default, the Up and Down arrows navigate among all the commands in the history, not just the ones that start with the prefix you've typed. To change this to the behavior you're used to, put the following lines in bash's initialization file, which is .bashrc in your home directory. Either run . ~/.bashrc or start a new shell to re-read the initialization file.
bind '"\eOA": history-search-backward'
bind '"\e[A": history-search-backward'
bind '"\eOB": history-search-forward'
bind '"\e[B": history-search-forward'
The escape sequences are what your terminal sends to the shell when you press an arrow key. Up may be \eOA (escape, OA) or \e[A depending on your terminal, and similarly for Down.
By default, bash offers different key bindings to search the command history. You can press Ctrl+R, then enter some characters to search for a command containing this substring anywhere on the line. Press Ctrl+S to go forward instead of backward. The search is incremental (i.e. as-you-type); Alt+P and Alt+N give you a non-incremental search.
Instead of bash and tcsh, you could switch to zsh, which has some neat features not found in other shells. Zsh has Ctrl+R and Ctrl+S by default just like bash. To get Up and Down like you had in tcsh, put the following lines in ~/.zshrc:
bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward
If you'd like to use the same shell everywhere, you can use bash or zsh on FreeBSD too, provided that the port is installed (again, ask your system administrator).
shareimprove this answer
add comment
tcsh is available for most Linux distributions. Try installing the tcsh package, then running chsh -s /bin/tcsh to make it your default shell.
shareimprove this answer
   
Thank you, you have enlighten me. –  Abdelilah Benaou Oct 17 '13 at 19:02
1 
Or you might consider switching to bash (I did). –  Keith Thompson Oct 17 '13 at 19:47
add comment
Other answers tackle it, but if you want more, take a look at https://github.com/zsh-users/zsh-history-substring-search
Prezto (https://github.com/sorin-ionescu/prezto) is also full of zsh goodies.
shareimprove this answer
   
Thank you for your answer, by the way I still don't see what benefits have zsh over bash or tcsh ? – Abdelilah Benaou Oct 22 '13 at 14:46
1 
Hum, you can do pretty much every basic stuff in all these shells. I use zsh because of pretty well maintained prezto bundle (probably the big game changer), right prompt (which is exclusive feature) and because it feels more polished than bash (consiguration and stuff). –  Fuad Saud Oct 22 '13 at 20:22
add comment

Your Answer

 
By posting your answer, you agree to the privacy policy and terms of service.

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

This ad is supporting your extension ClickOnceMore info | Privacy Policy | Hide on this page