Some command line shortcuts that might make your life easier. They’ve helped me, but sometimes I forget so I decided to group some of my favorites here.
To be specific, we’re talking bash. As a common default shell, there’s a good chance it’s what you’re using. So a lot of this can be found inside the bash manpage. If you’re using something else, I can’t say what of this might be compatible…
Event Designators
Ever need to repeat the last command? Easy, just use !!
$ echo some super-duper-annoy-to-retype command
some super-duper-annoy-to-retype command
$ !!
echo some super-duper-annoy-to-retype command
some super-duper-annoy-to-retype command
$ echo "!!" > what-was-that.txt
echo "echo some super-duper-annoy-to-retype command" > what-was-that.txt
$ cat what-was-that.txt
echo some super-duper-annoy-to-retype command
This is extremely handy if you meant to run the last command as sudo, just run sudo !!
Note, when you use !!
the first line of output is actually the expanded command.
But don’t stop at just shortcutting the last command, you can pull up any command from your histroy with !-n
where n is the nth most-recent command.
So !!
is the same as !-1
, the second to last would be !-2
and so on
$ echo this
this
$ echo that
that
$ !-2
echo this
this
Word Designators
Suppose we want to grab a specific word out of a recent command. For simplicity, we’ll start with assuming we want a word from the last command, and that command will be
echo one two three four five six seven eight nine ten
To get any nth word (starting from zero, which would be the command):
$ echo !!:0
echo echo
echo
$ echo !!:6
echo six
six
First argument:
$ echo !!:^
echo one
one
Last argument:
$ echo !!:$
echo ten
one
This is great for reusing the filepath from the end of a previous command. Suppose you ls
‘d when you meant to less
:
$ ls file.txt
file.txt
$ less !!:$
less file.txt
A better solution for fixing mistyped commands is discussed later in this post.
Range of arguments:
$ echo !!:3-6
echo three four five six
three four five six
All the arguments
$ echo !!:*
echo one two three four five six seven eight nine ten
one two three four five six seven eight nine ten
Now to twist things up a bit. For the designators that begin with ^
, $
, or *
(and -
, or %
, but not discussed here), you don’t need to include the colon.
So !!:$
for the last argument of the last command can be simplified to !!$
. Futhermore, when referencing the last command (!!
), you don’t need both exclamation points, !$
will do.
You can also change up the event designator to get the nth word from the 3rd last command, but I think at that point the shortcut is lost 🙂
Brace Expansion
Need a range of numbers?
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
1 to 10 by 2s?
$ echo {1..10..2}
1 3 5 7 9
Note, this requires bash v4 which is greater than the default version on OS X.
Also works with the alphabet
$ echo {b..p}
b c d e f g h i j k l m n o p
Need more of a set list? Use commas. This is handy for creating multiple files or directories at once
touch {dog,puppy}.txt
Search-and-replace
Remember earlier when you ls
‘d a file, and meant to less
it? Here’s a better fix, since it works with any number of arguments:
$ ls file.txt
file.txt
$ ^ls^less^
less file.txt
With this method, you’ll only replace the first instance of the word, so it’s great for fixing commands. For example, if you filename had ‘ls’ in it, you’d still be safe.
$ ls ls.txt
ls.txt
$ ^ls^less^
less ls.txt
There’s a more flexible search-and-replace syntax that tacks on to those event designators (!
commands from above). To start, here’s the equivalent command to the ^^^
style
$ ls ls.txt
ls.txt
$ !!:s/ls/less
less ls.txt
What if you do want to replace all instances of the word?
$ !!:gs/ls/less
Repeat the last replacement
$ !!:&
Of course, it can be nerve-racking to do an on-the-fly replacement on a potentially destructive command. Wouldn’t it be nice if you could preview the new command first? Well guess what…
$ !!:p:gs/ls/less
:p
will print the new command without executing it. Plus, it’ll put the new command in your history, so you can just hit the up arrow to load it back up if it looks good.
If most of this is new to you, I highly recommend working some into your regular workflow.
If only some was new, you might find cooler tricks in the manpages.
If this is all old hat, teach me something cool in the comments!