Припустимо, я хочу виконати послідовність із чотирьох команд, які я виконував раніше. Якщо перший в історії команд - 432, я можу зробити:
$ !432; !433; !434; !435
Мені цікаво, чи є більш ефективний спосіб досягти цього?
Припустимо, я хочу виконати послідовність із чотирьох команд, які я виконував раніше. Якщо перший в історії команд - 432, я можу зробити:
$ !432; !433; !434; !435
Мені цікаво, чи є більш ефективний спосіб досягти цього?
Відповіді:
Якщо це стосується команд, запущених зовсім недавно, більш ефективним способом є посилання на них з від'ємними числами:
!-4; !-3; !-2; !-1
Крім того, як тільки ви це зробите, ваш останній запис історії міститиме весь ланцюжок команд, тому ви можете повторити його !!
.
Редагувати:
Якщо ви ще цього не зробили, ознайомтеся з чудовою вбудованою функцією fc
, про яку згадував Жилль . (Використовуйте help fc
.) Виявляється, ви також можете використовувати негативні числа за допомогою нього, так що ви можете зробити те саме, що описано вище, використовуючи
eval "`fc -ln -4 -1`"
Однак є один застереження: після цього eval
рядок зберігається в історії як остання команда. Тож якщо запустити це ще раз, ви потрапите в цикл!
Більш безпечним способом цього є використання fc
режиму роботи за замовчуванням : пересилання вибраного діапазону команд до редактора та запуску їх після виходу з нього. Спробуйте:
fc -4 -1
Ви навіть можете змінити порядок діапазону команд: fc -1 -4
Для перегляду діапазону команд в історії використовуйте вбудовану fc
команду:
fc -ln 432 435
Щоб виконати їх знову:
eval "$(fc -ln 432 435)"
man fc
мені нічого не дають. Що означає fc
? Які ще варіанти є?
help fc
... і також help help
.... help: help [-dms] [pattern ...] Відображення інформації про вбудовані команди.
-l
прапора він буде страчений без потреби зла eval
.
fc
означає "знайти команду" або "виправити команду".
Існує приємний і альтернативний спосіб запускати ряд команд послідовно з історії Bash:
замість використання замінника історії ( !432
або !-4
) ви можете шукати історію за допомогою Ctrl+ rі, як тільки ви знайдете першу команду, яку хочете виконати запустити, натиснути Ctrl+ o( операція-і-отримати-далі ) замість returnключа.
Це запустить команду і запропонує наступну з історії. Ви можете натиснути Ctrl+oскільки завгодно часу, і закінчити послідовність або returnостаннім, або Ctrl+cзупинити, не запускаючи його.
Ctrl-o
його, просто виводить буквальне ^o
і розбиває моє (reverse-i-search)
. Можливо, тут є якась інша установка.
Щоб виконати команди негайно, а не редагувати їх, ось синтаксично стрункіша версія відповіді Гілза за допомогою eval :
fc -e: 432 435
Аргумент двокрапки до -e - це bash noop, який спричиняє пропуск кроку "відкрити в редакторі", який хоче fc. Крім того, тепер (недавня) історія міститиме фактичні команди з історії, а не оператор eval.
fc
для петлі і xsel
Це добре працює, коли я хочу об'єднати та повторно запустити останні n команд кілька разів:
fcn() (
from="${1:-2}"
to="${2:-1}"
if [ "$from" -ne "$to" ]; then
for i in `seq "$from" -1 "$(($to + 1))"`; do
printf "$(fc -ln -${i} -${i}) && "
done
fi
printf "$(fc -ln -${to} -${to})"
)
Тоді:
$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$ echo a && echo b && echo c
a
b
c
$ # Paste again if you feel like it.
$ echo a && echo b && echo c
a
b
c
Або для більших команд, які можуть потребувати редагування:
fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
history -p \!43{2..5}
друк команд 432 по 435 до терміналу, що підходить для подальшої копіювання / вставки.