Повторить последнюю команду N раз

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, так что я не единственный, кто перешел по ссылке, чтобы попасть сюда)

.
7
21.06.2017, 16:43
6 ответов

Команда seq является частью стандартного *nix и поэтому не зависит от вашей оболочки. Используя его и конструкцию цикла вашей оболочки, вы можете сделать что-то вроде этого:

для i в $(seq 30); делать !!; выполнено

или

для i в 'seq 30'; делать !!; сделано

0
27.01.2020, 20:14

Самое короткое, что я могу придумать, это:

date # or whatever command
for i in {1..30}; do !!; done
9
27.01.2020, 20:14

С 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); { !!; }
12
27.01.2020, 20:14

Одним из подходов может быть использование редактора строк для вставки !!;30 раз.

Аналогично со строковым редакторомreadline(bash)в режиме vi:

!!;Escdd30p

Эквивалент режима emacsработает со строковым редактором zsh, но явно не с bashв readline. Однако вместо этого вы можете использовать макросы readlinekbd, которые, по-видимому, можно повторять:

Определите макрос kbd как!!;:

Ctrl+X(!!;Ctrl+X)

Который впоследствии можно вызвать 30 раз как:

Alt+3Alt+0Ctrl+Xe
3
27.01.2020, 20:14

Это немного некрасиво, но:

 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;'
1
27.01.2020, 20:14

Еще один цикл в 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

0
27.01.2020, 20:14

Теги

Похожие вопросы