Useful shell history expansion

If you ever use the command line you may have run into the following. You enter a command only to find out that you should have used ‘sudo’. For example when trying to copy a file to a location you don’t have write access to.

$ cp foo /usr/local/bin
cp: /usr/local/bin/foo: Permission denied

To repeat the previous command preceded by ‘sudo’, you can use bash’s (and csh’s and the ever popular zsh’s) history expansion.

$ sudo !!
sudo cp foo /usr/local/bin/
Password:

The first ! starts history expansion. It is followed by a number (the event designator) pointing to the command to use. This number can be negative. To repeat the previous command you would use !-1. The even shorter event designator !! in the example above is shorthand for this specific case. As you can see the shell will echo the expanded command that it will then immediately execute.

!! is useful for repeating entire commands but what if you want to use just parts of a previous command? That is possible by adding a colon followed by a so called word designator.

To get the last ‘word’ from the previous command you would use !!:$ or even shorter !$. If, for example, you wanted to create a directory and change into it without having to retype the path you could use:

$ mkdir -p foo/bar/baz
$ cd !$
cd foo/bar/baz

(The -p parameter used for the mkdir command will create all necessary parent directories if needed.)

There is a lot more you can do with history expansion in specific situations. I have found that these two already make a big difference on a daily basis.