On the support team, we’re jumping in and out of shells constantly. At any time during my work day, I’ll see at least four instances of PuTTY in my task bar, so one thing I learned quickly was that efficiency and accuracy in accessing ultimately make life easier for our customers and for us as well. Spending too much time rewriting paths, commands, VI navigation, and history cycling can really bring you to a crawl. So now that you have had some time to study bash and practice a little, I thought I’d share some of the keyboard shortcuts that help us work as effectively and as expediently as we do. I won’t be able to cover all of the shortcuts, but these are the ones I use most:
[Tab] is one of the first keyboard shortcuts that most people learn, and it’s ever-so-convenient. Let’s say you just downloaded
pckg54andahalf-5.2.17-v54-2-x86-686-Debian.tar.gz, but a quick listing of the directory shows you ALSO downloaded
1.2.3 at some point in the past. What was that file name again? Fret not. You know you downloaded 5.2.something, so you just start with, say,
pckg, and hit [Tab]. This autocompletes everything that it can match to a unique file name, so if there are no other files that start with “
pckg,” it will populate the whole file name (and this can occur at any point in a command).
In this case, we’ve got four different files that are similar:
pckg54andahalf-5.2.17-v54-2-x86-686-Debian.tar.gz <-- we want this one
So typing "
pckg" and hitting [Tab] brings up:
NOW, what you could do, knowing what files are there already, is type "
5.2" and hit [Tab] again to fill out the rest. However, if you didn't know what the potential matches were, you could double-tap [Tab]. This displays all matching file names with that string.
Another fun fact: This trick also works in Windows.
[CTRL+R] is a very underrated shortcut in my humble opinion. When you've been working in the shell for untold hours parsing logs, moving files and editing configs, your bash history can get pretty immense. Often you'll come across a situation where you want to reproduce a command or series of commands that were run regarding a specific file or circumstance. You could type "
history" and pore through the commands line by line, but I propose something more efficient: a reverse search.
Example: I've just hopped on my system and discovered that my SVN server isn't doing what it's supposed to. I want to take a look at any SVN related commands that were executed from bash, so I can make sure there were no errors. I'd simply hit [CTRL+R], which would pull up the following prompt:
s" at this point would immediately return the first command with the letter "
s" in it in the history ... Keep in mind that's not just starting with s, it's containing an s. Finishing that out to "
svn" brings up any command executed with those letters in that order. Pressing [CTRL+R] again at this point will cycle through the commands one by one.
In the search, I find the command that was run incorrectly ... There was a typo in it. I can edit the command within the search prompt before hitting enter and committing it to the command prompt. Pretty handy, right? This can quickly become one of your most used shortcuts.
CTRL+W & CTRL+Y
This pair of shortcuts is the one I find myself using the most. [CTRL+W] will basically take the word before your cursor and "cut" it, just like you would with [CTRL+X] in Windows if you highlighted a word. A "word" doesn't really describe what it cuts in bash, though ... It uses whitespace as a delimiter, so if you have an ultra long file path that you'll probably be using multiple times down the road, you can [CTRL+W] that sucker and keep it stowed away.
Example: I'm typing
nano /etc/httpd/conf/httpd.conf (Related: The redundancy of this path always irked me just a little).
Before hitting [ENTER] I tap [CTRL+W], which chops that path right back out and stores it to memory. Because I want to run that command right now as well, I hit [CTRL+Y] to paste it back into the line. When I'm done with that and I'm out referencing other logs or doing work on other files and need to come back to it, I can simply type "
nano " and hit [CTRL+Y] to go right back into that file.
For the sake of covering most of my bases, I want to make sure that [CTRL+C] is covered. Not only is it useful, but it's absolutely essential for standard shell usage. This little shortcut performs the most invaluable act of killing whatever process you were running at that point. This can go for most anything, aside from the programs that have their own interfaces and kill commands (vi, nano, etc). If you start something, there's a pretty good chance you're going to want to stop it eventually.
I should be clear that this will terminate a process unless that process is otherwise instructed to trap [CTRL+C] and perform a different function. If you're compiling something or running a database command, generally you won't want to use this shortcut unless you know what you're doing. But, when it comes to everyday usage such as running a "
top" and then quitting, it's essential.
Repeating a Command
There are four simple ways you can easily repeat a command with a keyboard shortcut, so I thought I'd run through them here before wrapping up:
- The [UP] arrow will display the previously executed command.
- [CTRL+P] will do the exact same thing as the [UP] arrow.
- Typing "
!!" and hitting [Enter] will execute the previous command. Note that this actually runs it. The previous two options only display the command, giving you the option to hit [ENTER].
- Typing "
!-1" will do the same thing as "
!!", though I want to point out how it does this: When you type "
history", you see a numbered list of commands executed in the past
-1being the most recent. What "
!-1" does is instructs the shell to execute (
!) the first item on the history (
-1). This same concept can be applied for any command in the history at all ... This can be useful for scripting.
What it really comes down to is finding what works for you and what suits your work style. There are a number of other shortcuts that are definitely worthwhile to take a look at. There are plenty of cheat sheets on the internet available to print out while you're learning, and I'd highly recommend checking them out. Trust me on this: You'll never regret honing your mastery of bash shortcuts, particularly once you've seen the lightning speed at which you start flying through the command line. The tedium goes away, and the shell becomes a much more friendly, dare I say inviting, place to be.
Quick reference for these shortcuts:
- [TAB] - Autocomplete to furthest point in a unique matching file name or path.
- [CTRL+R] - Reverse search through your bash history
- [CTRL+W] - Cut one "word" back, or until whitespace encountered.
- [CTRL+Y] - Paste a previously cut string
- [CTRL+P] - Display previously run command
- [UP] - Display previously run command