It may or may not surprise you to know that the bash shell has a very rich array of convenient shortcuts that can make your life, working with the command line, a whole lot easier. This ability to edit the command line using shortcuts is provided by the GNU Readline library. This library is used by many other *nix application besides bash, so learning some of these shortcuts will not only allow you to zip around bash commands with absurd ease :), but can also make you more proficient in using a variety of other *nix applications that use Readline. I don’t want to get into Readline too deeply so I’ll just mention one more thing. By default Readline uses emacs key bindings, although it can be configured to use the vi editing mode, I however prefer to learn the default behavior of most applications (I find it makes my life easier not having to constantly customize stuff). If you’re familiar with emacs then many of these shortcuts will not be new to you, so these are mostly for the rest of us :).
Command Editing Shortcuts
- Ctrl + a – go to the start of the command line
- Ctrl + e – go to the end of the command line
- Ctrl + k – delete from cursor to the end of the command line
- Ctrl + u – delete from cursor to the start of the command line
- Ctrl + w – delete from cursor to start of word (i.e. delete backwards one word)
- Ctrl + y – paste word or text that was cut using one of the deletion shortcuts (such as the one above) after the cursor
- Ctrl + xx – move between start of command line and current cursor position (and back again)
- Alt + b – move backward one word (or go to start of word the cursor is currently on)
- Alt + f – move forward one word (or go to end of word the cursor is currently on)
- Alt + d – delete to end of word starting at cursor (whole word if cursor is at the beginning of word)
- Alt + c – capitalize to end of word starting at cursor (whole word if cursor is at the beginning of word)
- Alt + u – make uppercase from cursor to end of word
- Alt + l – make lowercase from cursor to end of word
- Alt + t – swap current word with previous
- Ctrl + f – move forward one character
- Ctrl + b – move backward one character
- Ctrl + d – delete character under the cursor
- Ctrl + h – delete character before the cursor
- Ctrl + t – swap character under cursor with the previous one
Command Recall Shortcuts
- Ctrl + r – search the history backwards
- Ctrl + g – escape from history searching mode
- Ctrl + p – previous command in history (i.e. walk back through the command history)
- Ctrl + n – next command in history (i.e. walk forward through the command history)
- Alt + . – use the last word of the previous command
Command Control Shortcuts
- Ctrl + l – clear the screen
- Ctrl + s – stops the output to the screen (for long running verbose command)
- Ctrl + q – allow output to the screen (if previously stopped using command above)
- Ctrl + c – terminate the command
- Ctrl + z – suspend/stop the command
Bash Bang (!) Commands
Bash also has some handy features that use the ! (bang) to allow you to do some funky stuff with bash commands.
- !! - run last command
- !blah – run the most recent command that starts with ‘blah’ (e.g. !ls)
- !blah:p – print out the command that !blah would run (also adds it as the latest command in the command history)
- !$ – the last word of the previous command (same as Alt + .)
- !$:p – print out the word that !$ would substitute
- !* – the previous command except for the last word (e.g. if you type ‘find some_file.txt /‘, then !* would give you ‘find some_file.txt‘)
- !*:p – print out what !* would substitute
There is one more handy thing you can do. This involves using the ^^ ‘command’. If you type a command and run it, you can re-run the same command but substitute a piece of text for another piece of text using ^^ e.g.:
$ ls -al total 12 drwxrwxrwx+ 3 Administrator None 0 Jul 21 23:38 . drwxrwxrwx+ 3 Administrator None 0 Jul 21 23:34 .. -rwxr-xr-x 1 Administrator None 1150 Jul 21 23:34 .bash_profile -rwxr-xr-x 1 Administrator None 3116 Jul 21 23:34 .bashrc drwxr-xr-x+ 4 Administrator None 0 Jul 21 23:39 .gem -rwxr-xr-x 1 Administrator None 1461 Jul 21 23:34 .inputrc $ ^-al^-lash ls -lash total 12K 0 drwxrwxrwx+ 3 Administrator None 0 Jul 21 23:38 . 0 drwxrwxrwx+ 3 Administrator None 0 Jul 21 23:34 .. 4.0K -rwxr-xr-x 1 Administrator None 1.2K Jul 21 23:34 .bash_profile 4.0K -rwxr-xr-x 1 Administrator None 3.1K Jul 21 23:34 .bashrc 0 drwxr-xr-x+ 4 Administrator None 0 Jul 21 23:39 .gem 4.0K -rwxr-xr-x 1 Administrator None 1.5K Jul 21 23:34 .inputrc
Here, the command was the ^-al^-lash which replaced the –al with –lash in our previous ls command and re-ran the command again.
There is lots, lots more that you can do when it comes to using shortcuts with bash. But, the shortcuts above will get you 90% of the way towards maximum bash productivity. If you think that I have missed out on an essential bash shortcut that you can’t live without (I am sure I have), then please let me know and I’ll update the post. As usual, feel free to subscribe to my feed for more tips and opinions on all things software development.
Image by djhsilver
Related posts:
- The Most Handy NetBeans Shortcuts For Ruby Development
- Executing Multiple Commands – A Bash Productivity Tip
- The Most Common Things You Do To A Large Data File With Bash
- Bash Shell Awesomeness – Mass Killing Processes (On Ubuntu)
- Using Bash To Output To Screen And File At The Same Time
- Output Redirection With Bash
- Sort Files Like A Master With The Linux Sort Command (Bash)
{ 5 trackbacks }
{ 22 comments… read them below or add one }
Great article; I love this kind of stuff, because you always discover something you forgot (or had never noticed before).
It might be worth pointing out that this command…
# Ctrl + xx – move between start of command line and current cursor position (and back again)
lets you operate with a mark ring, such that, if you Ctrl + xx from current cursor position to start of line, then manually move cursor to a new location, that new location will be swapped for ’start of line’, so you have a rotating ring of ‘bookmarks’ based on current and last cursor position.
A favorite of my own: Alt+Backspace. Deletes backward one word. Respected in a surprising number of interfaces; particularly useful with filesystem/URI paths, as it understands the various portions of the string and will let you easily delete a portion at a time. Try it in your Location Bar.
That’s great info about backspace and especially cool that it works in browser location bar, thanks for the tip.
Most of the Ctl and Alt hints will be familiar to users of Emacs (not to be confused with eMacs).
Yeah I mentioned at the top of the post that readline borrowed heavily from emacs, even though now emacs itself uses readline I believe :).
Great post – do you have by chance a great post/tutorial for generating SSH keys (especially with cPanel/WHM & OS X?
What about SCP (recursive) from a VPS to a local machine?
@brianjking me on twitter or reply here, although Twitter is easier. Cheers!
Thank you!
I was actually planning to do a general post about using ssh with linux, how keys come into it and what you need to do. I am not sure when I will write it up, but stick around and it will come up eventually.
For the curious, a few of those command editing keyboard combinations are from Emacs; if you use Mac OS X (which integrates a few Emacs commands in the GUI too) some of those commands are a tad different. I won’t outline them here, as it should be straight forward to find a doc outlining them.
Cool post OP!
Yeah you’re right they are, there is no Alt key on a Mac (I think I am not a mac user) instead there is a meta key. So substituting Alt with Meta might work, but there is also another way. Many of the shortcuts listed have equivalents that use the Esc key which will work on Mac or Linux.
“Try it in your *browser’s* Location Bar”, that should read.
Wonderful compilation, I didn’t know Alt+.
Thanks for the post. I already knew, and use, a bunch of these every day, but some of them just blew me away! I love the ^^ substitute shortcut; that one alone is set to revolutionise my Bash experience!
Yeah, I was pretty blown away when I learned about that one also :).
Nice article. Though it’s lib readline shortcuts, which emacs and bash incorporates. :)
Exactly, as I mentioned at the start of the post :)
Put this in your ~/.inputrc
“\e[A”: history-search-backward
“\e[B”: history-search-forward
“\C-p”: history-search-backward
“\C-n”: history-search-forward
Type something, then pressing Ctrl-p(or Ctrl-n) will initiate the search in the history with the already typed text as prefix
Before reading this article I was limited in bash tricks to…
history | grep “something”
!#
where # was the line in history for the command.
Its still useful but definitely good to know all the other commands. Now if I can just remember to use them…
Yeah I tend to use that one as well myself :). You’re right though, the most challenging thing is teaching yourself to actually use the shortcuts in the first place.
Generating SSH keys is quite simple in linux
1. install openssh client & server or virtual packages depending on your OS using apt/yum/pkg/pacman or whichever way you install
2. switch to the username in which you want to create trust for , i.e.
su – aaron
3. Type ’ssh-keygen -t rsa’ (or dsa if you like) follow the prompts people usually dont use passcode phrases and just press enter to all those questions
4. Type ’ssh-copy-id -i ~/.ssh/id_pub.rsa username@host’ (or dsa if thats what you chose)
you can efficently omit username@ as you have already switched to the user but this is an example so to be full i use the full syntax.
5. Enter your password one time as prompted.
6. When that application exits you should now be able to ssh scp rsync via ssh all passwordless.
In regards to history | grep
cat /home/*/.bash_history | grep is killer from security standpoint…
I love those ones but you’ll get kick out of
type CTRL + r (ctrl plus the r button) …get a prompt like below
[1] rainofkayos@rain ~ % [482]
bck-i-search: _
once there just type some letters from what you think the command contained, it will come up with the last whole line you type in bash that matches it,, you can continue to sort the results further back by holding CTRL and keep pressing r…once you found it,, just type the right direction key and there it is ready for you to press ENTER… i know that sounds like a lot but,, when you get the hang of it its rather snazZy =)
Yeah, CTRL-R is awesome, I use it all the time :)
Great post. On behalf of all newbs – Thank you!
You’re welcome