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

В bash я попытался написать сценарий для запуска последних N команд. Например, N = 5

for i in {1...5} do !-5 done 

Проблема в том, что! -5 заменяется пятой последней командой на моей оболочке (скажем, время), а команда «время» выполняется 5 раз.

Могу ли я внести какие-либо изменения в мой скрипт, чтобы он запускал последние 5 команд на моей оболочке в серии?

ПРИМЕЧАНИЕ. Я разместил этот вопрос ПОСЛЕ проверки другого аналогичного вопроса, который не отвечал моим требованиям. Ситуация была аналогична ситуации:
Qn1 – «Как вы печатаете 3 последовательных тильда« ~~~ »в C ++»
Ans: cout << "~~~";

Qn2 – «Как вы печатаете N последовательных тильдов« ~~~ »в C ++»
Ans: Запустите цикл и сделайте cout << "~"; внутри петли

Вопросы, отмеченные как дубликаты, похожи на Qn1 сверху, а то, что я хотел, было ответом на Qn2 сверху. Поэтому я обсуждаю тот факт, что это дубликат предыдущего вопроса.

  • Чтение нажатий клавиш в оболочке с использованием сигналов trap и Unix
  • POSIX-совместимый / кросс-shell-способ для получения версии запущенной оболочки?
  • Невозможно создать фоновый процесс
  • результат фильтрации команды ls для получения только определенных имен файлов на основе формата
  • Условные обозначения для рыбы
  • Общие обозначения и стандарты флагов для сценариев и функций оболочки
  • Оптимизация сценария оболочки с длительным циклом работы
  • Извлечение информации о трассировке с помощью gawk
  • 3 Solutions collect form web for “Повторить последние команды N”

    С помощью fc -N -1 редактор открывается с последними N командами.
    Вы можете редактировать команды.
    Они запускаются, когда вы их сохраняете.

    Если вы не хотите редактировать команды, используйте параметр fc -e чтобы указать cat в качестве редактора:

     fc -e : -3 -1 

    Если вы хотите использовать его с аргументом для N, псевдоним не поможет. У вас даже не может быть псевдонима типа «fc -1» и и добавить -N , потому что -1 должен быть после -N .

    Поэтому нам нужно использовать функцию:

     runlast () { fc -e : "-${1:-1}" -1 } 

    N равно 1 если аргумент не задан; В этом случае последняя команда повторяется.

    Вот как это работает, используя echo 1 для echo 4 в качестве последних команд:

     $ echo 1 1 $ echo 2 2 $ echo 3 3 $ echo 4 4 $ runlast 2 echo 3 echo 4 3 4 $ 

    (Последняя строка с $ – это новое приглашение).

    Не уверен, что вы пытаетесь сделать точно, но вы можете попробовать что-то вроде:

     eval "$(fc -ln -5)" 

    Или

     fc -e : -5 -1 

    Повторное выполнение последних 5 команд.

    Я думаю, вы можете это сделать:

     $ echo yo yo $ echo hey there hey there $ for i in {2..1}; do eval "$(history -p \!-$i)"; done yo hey there 

    Из help history :

     -p perform history expansion on each ARG and display the result without storing it in the history list 
    Linux и Unix - лучшая ОС в мире.