I use !$
(11.3
)
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 (20.14
)
and make an edit to article files named 1171
, 6830
,
and 2340
for this book, 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
11.7
.
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!