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

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 
  • Как запустить веб-страницу в фоновом режиме?
  • Как назначить слова с пробелами как целое имя переменной в сценарии оболочки?
  • Пустой файл без grep, впоследствии обрабатывающий его как двоичный файл
  • Как выполнить команды Netscaler через удаленную машину через SSH-соединение
  • Доступ к переменной индекса массива из цикла сценария оболочки bash?
  • Использовать оболочку, не установленную на удаленном компьютере
  • Элегантный способ подсчета, сколько раз шаблоны из файла встречаются в другом файле
  • Скрипт для su-c на экран не работает как предполагалось
  • Как я могу выполнить скрипт оболочки, который существует в длинном пути с помощью одной команды без первого cd'ing в каталог?
  • Использование MPI с .sh скриптом?
  • Избегайте расширения обратной косой черты с эхом в тире
  • Linux и Unix - лучшая ОС в мире.