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:
! 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
!! 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
!! 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
!$. 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
-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.