My Favorite Is !:n*

I use !$ () a lot. But my favorite bash (and csh) history substitution is !:n*, where n is a number from 0 to 9. It means "take arguments n through the last argument on the previous command line." Since I tend to use more than one argument with UNIX commands, this lets me type the arguments (usually filenames) only once. For example, to use RCS () and make an edit to article files named , , and for this tutorial, I did:

% co -l 1171 6830 2340 RCS/1171,v -> 1171 ... RCS/2340,v -> 2340 revision 1.8 (locked) done % vi !:2* vi 1171 6830 2340 3 files to edit ... % ci -m"Changed TERM xref." !* ci -m"Changed TERM xref." 1171 6830 2340 ...

In the first command line (co), I typed the filenames as arguments 2, 3, and 4. In the second command line (vi), I used !:2*; that grabbed arguments 2 through the last (in this case, argument 4) from the first command line. The result was a second command line that had those three filenames as its arguments 1, 2, and 3. So, in the third command line (ci), I used !* to pick arguments 1 through the last from the previous (second) command line. (!* is shorthand for !:1*.)

You can also grab arguments from previous command lines. For example, !em:2* grabs the second through last arguments on the previous emacs command line (command line starting with "em"). There are lots more of these in article .

If those look complicated, they won't be for long. Just learn to count to the first argument you want to grab. It took me years to start using these substitutions - but they've saved me so much typing that I'm sorry I didn't get started earlier!

- JP