man
Страницы могут быть очень информативными. Не пугайтесь их. Помимо всего прочего, в man less
говорится, что вы можете использовать команду R
для:
R Repaint the screen, discarding any buffered input. Useful if the file is changing while it is being viewed.
(Я понимаю, что этому вопросу уже более 6 лет, но он всплывает в поиске Google, так что я не единственный, кто перешел по ссылке, чтобы попасть сюда)
. Команда seq
является частью стандартного *nix и поэтому не зависит от вашей оболочки. Используя его и конструкцию цикла вашей оболочки, вы можете сделать что-то вроде этого:
для i в $(seq 30); делать !!; выполнено
или
для i в 'seq 30'; делать !!; сделано
Самое короткое, что я могу придумать, это:
date # or whatever command
for i in {1..30}; do !!; done
С zsh
и при условии, что последняя командная строка была только одной командой или конвейером или и -или списком (, то есть, например, echo x
, echo x | tr x y
, echo x && echo y
, даже составными командами, такими как { x; y; }
или for
/while
петли, но неecho x; echo y
):
repeat 30 !!
Чтобы повторить предыдущую командную строку, даже если она содержала несколько команд, используйте:
repeat 30 do !!; done
Или:
repeat 30 {!!}
С bash
и для простых -команд только (среди приведенных выше примеров, только для случая echo x
), вы можете определить вспомогательную функцию, например:
repeat() {
local n="$1"
shift
while ((n-- > 0)); do
"$@"
done
}
(и используйте repeat 30 !!
, как указано выше ). Побочным эффектом является то, что, поскольку код будет выполняться в функции, он увидит разные "$@"
, "$#"
и такие вещи, как typeset
, будут работать по-другому, поэтому вы не сможете делать такие вещи, как:
eval 'echo "$1"'
repeat 30 !!
Другой подход к эмуляции zsh
's repeat 30 {!!}
состоит в том, чтобы объявить псевдоним, например:
alias repeat='for i in $(seq'
(при немодифицированном$IFS
)
Затем используйте:
repeat 30); { !!; }
Одним из подходов может быть использование редактора строк для вставки !!;
30 раз.
Аналогично со строковым редакторомreadline
(bash
)в режиме vi
:
!!;Escdd30p
Эквивалент режима emacs
работает со строковым редактором zsh
, но явно не с bash
в readline
. Однако вместо этого вы можете использовать макросы readline
kbd, которые, по-видимому, можно повторять:
Определите макрос kbd как!!;
:
Ctrl+X(!!;Ctrl+X)
Который впоследствии можно вызвать 30 раз как:
Alt+3Alt+0Ctrl+Xe
Это немного некрасиво, но:
eval "`fc -ln -1`;: "{1..10}\;
Начальный пробел не является строго обязательным, но полезен для предотвращения ввода команды eval
в историю, если $HISTCONTROL
содержитignorespace
(илиignoreboth
).
В качестве альтернативы:
eval "fc -s $((HISTCMD-2)) "{1..10}\;
И:
eval 'history -s '{1..10}';fc -s -2;'
Еще один цикл в bash (например. после этого:https://unix.stackexchange.com/a/372487/9689)
Сделайте его исполняемым файлом где-нибудь в $PATH
с именем repeat
для достижения аналогичного эффекта, как в zsh(https://unix.stackexchange.com/a/372484/9689):
#!/bin/bash
n=$1
shift 1
for ((x=0; x<$n; ++x)); do
"$@"
done
чтобы потом можно было:
$ repeat 3 date
суть :https://gist.github.com/gwpl/26fefe3a165304f3dedb21009506107f