Чи існує ярлик для виконання серії команд в історії баш?


20

Припустимо, у мене є такий тривіальний приклад у моєму history:

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

Якщо я хотів виконувати команди 77, 78і 79в одній команді чи існує ярлик для цього? Я спробував !77 !78 !79, який просто розмістить їх усіх в одному рядку для виконання.


9
Є чи в !77 ; !78 ; !79порядку?
триг

1
Я думаю, що все, що не вводити рядок за рядком, добре, але сподівався на щось трохи більш лаконічне (по лінії !77-79)
MrDuk

1
@MrDuk, хлопчик зробив, що мені знадобилося деякий час. Дивіться мою оновлену відповідь на дуже стисле рішення! :)
Wildcard

Це магічно! :)
MrDuk

Відповіді:


28

РЕДАКТУВАННЯ: Ви можете зробити це в сумісному з POSIX способом за допомогою інструменту командування fixfc :

fc 77 79

Це відкриє ваш редактор (можливо vi) командами від 77 до 79 у буфері. Коли ви зберігаєте та виходите ( :x), команди будуть виконуватися.


Якщо ви не хочете редагувати їх, і ви ДУЖЕ Впевнені, що знаєте, які команди ви викликаєте, ви можете використовувати:

fc -e true 77 79

Це використовується trueяк "редактор" для редагування команд, тому він просто виходить, не вносячи жодних змін, і команди виконуються як є.


ОРИГІНАЛЬНИЙ ВІДПОВІДЬ:

Ви можете використовувати:

history -p \!{77..79} | bash

Це передбачає, що ви не використовуєте ні псевдоніми, ні функції, ні будь-які змінні, які є лише в поточному середовищі виконання, оскільки, звичайно, вони не будуть доступні в новому запущеному оболонці.


Краще рішення (спасибі Майклу Гофману за те, що він нагадував мене в коментарях):

eval "$(history -p \!{77..79})"

Один з дуже-дуже мало випадків, коли evalнасправді доречно!


Також дивіться:


2
Це не спрацює правильно, якщо будь-яка з команд змінить поточне середовище виконання, наприклад, змінивши змінну або зробивши a cd, але це крайній випадок.
G-Man каже: "Відновіть Моніку"

3
eval "$(history -p \!{77..79})"повинні працювати.
Майкл Гофман

1
@MichaelHoffman, я думав про це і думав, що спробував це, але я просто зрозумів, що кинув цитування! D'oh! Недарма не вийшло ... редагування відповіді зараз.
Wildcard

14

Проста відповідь: замість !77 !78 !79,

  • тип, !77; !78; !79щоб зробити те, що вам здається, що ви намагаєтеся зробити - виконайте команду 77, а потім команду 78, а потім команду 79, безумовно, або
  • введіть !77 && !78 && !79 для виконання команди 77 і перевірте, чи вдалося це. І тоді, якщо команда 77 вдалася, виконайте команду 78. І тоді, якщо команда 78 вдалася, виконайте команду 79.

Трохи розумніша відповідь (якщо ви знаходитесь у вікні типу терміналу):

  • З'ясуйте, який номер команди буде наступною командою, яку ви введете.
    • Це можливо включити до вашого підказки; Я вважаю, що це включено \!до вашого PS1.
    • Або подивіться список вашої історії. Якщо останній запис є 82 history, то наступна ваша команда - 83.
  • Віднімаємо 83−77 = 6.
  • Тип !-6. Це повторно виконає команду 77.
  • Виберіть !-6, скопіюйте його та вставте. Оскільки ваше повторне виконання команди 77 ( ./generator.sh) було командою 83, ви тепер перебуваєте на команді 84, тому !-6повторно виконується команда 78.
  • Повторіть наклеювання !-6за бажанням.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.