Повторить последние команды 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 сверху. Поэтому я обсуждаю тот факт, что это дубликат предыдущего вопроса.

  • блока операторов Механизм в сценариях оболочки?
  • Как обмениваться словами в имени файла с помощью оболочки?
  • переименовывать случайные файлы на USB-устройстве
  • Использование регулярного выражения в ls и mv
  • Первая строка сценария
  • Как убить этот процесс в bash
  • как подключиться к Mysql только один раз?
  • Изменение прав доступа к файлам в соответствии с их именами
  • 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 
    Interesting Posts

    Команда env показывает 3 раза тот же путь

    Восстановить права доступа к системному файлу

    Относительно отдельного файла в несколько файлов в соответствии с разделом строк

    Операторы печати в реальном времени с тройником в интерактивном скрипте

    Переключение рабочего стола в KDE при запуске приложения с другой активностью

    «Ошибка: неявное объявление функции« vfs_readlink »при установке VMware Tools

    «While read» также выводит то, что не читается / не редактируется

    Как узнать чувствительность Wi-Fi (RSSI)

    Найти количество элементов в массиве, на которые ссылается динамически созданное имя

    Получить первый / второй столбец файлов

    не может получить доступ к скрытой панели LXDE

    Как вы гарантируете, что физические сетевые интерфейсы всегда получают одно и то же имя интерфейса при перезагрузках встроенной системы Linux?

    Как работает xbacklight?

    Дэш-эквивалент саморасправки выхода скрипта

    Возможно ли иметь bashrc для группы пользователей?

    Linux и Unix - лучшая ОС в мире.