Repeat last command N times
With zsh
, and provided the last command line was only one command or pipeline or and-or list (that is for instance echo x
, echo x | tr x y
, echo x && echo y
, even compound commands like { x; y; }
or for
/while
loops but not echo x; echo y
):
repeat 30 !!
To repeat the previous command line even if it contained several commands, use:
repeat 30 do !!; done
Or:
repeat 30 {!!}
With bash
and for simple-commands only (among the examples above, only the echo x
case), you could define a helper function like:
repeat() {
local n="$1"
shift
while ((n-- > 0)); do
"$@"
done
}
(and use repeat 30 !!
like above). A side effect is that because the code will be running in a function, it will see different "$@"
, "$#"
and things like typeset
will work differently, so you can't do things like:
eval 'echo "$1"'
repeat 30 !!
Another approach to emulate zsh
's repeat 30 {!!}
would be to declare an alias like:
alias repeat='for i in $(seq'
(assuming an unmodified $IFS
)
And then use:
repeat 30); { !!; }
The shortest I can come up with is:
date # or whatever command
for i in {1..30}; do !!; done
One approach could be to use the line editor to insert !!;
30 times.
Like with readline
(bash
's line editor) in vi
mode:
!!;Escdd30p
The emacs
mode equivalent does work with the zsh
line editor but apparently not with bash
's readline
. However you could use readline
kbd macros instead which apparently can be repeated:
Define the kbd macro as !!;
:
Ctrl+X(!!;Ctrl+X)
Which you can later invoke 30 times as:
Alt+3Alt+0Ctrl+Xe