Here’s a quick trick I’ve been using for a while, but have found that not many others know about it. It’s a way to grab the arguments from the last command you executed. Command line expansion allows you to do many things, but today we’ll focus on just argument expansion.

First to simply repeat the last command with !!. This is most helpful when needing to prefix a command; with something like sudo or bundle exec.

$ mv /really/long/path/with/more/dirs/file /another/deeply/nested/dir/structure
mv: cannot move `...' to `...': Permission denied

$ sudo !!

Learn more about bang-bang on episode 32 of sysadmin casts.

Expanding on this concept, how about only part of the previous command? The !$ history expansion expands to the last argument (or token) from the previous command. Working off the previous example, if we now want to edit that freshly moved file:

$ vim !$

which expands to

$ vim /another/deeply/nested/dir/structure

Quick and easy! There are many ways to use history expansion to get parts of the previous (and others from history) command. !$ is by far the one I use the most. You’ll do yourself a huge favor to commit that to muscle memory.

To get an argument other than the last, you can use !:x where x is the (0 based) index of the arguemnt, or a range, or * to get all the arguments.

$ vim /another/deeply/nested/dir/structure
$ git checkout -b features/laser-sharks

  !:2     => -b
  !:0     => git
  !:$     => features/laser-sharks
  !:^     => checkout
  !:1-2   => checkout -b
  !:-2    => git checkout -b
  !:2-$   => -b features/laser-sharks
  !:*     => checkout -b features/laser-sharks

ZSH power tip: Tapping tab with any of these expansions in ZSH will expand them inline to preview before executing.

Happy history-ing!

– Chris


Christopher R Marshall


Enjoys programming web applications; especially in Ruby and Go. Also enjoys playing ice hockey as a goalie and playing the guitar.