Предположим, я хочу выполнить последовательность из четырех команд, которые я выполнял ранее. Если первый - 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
.
Существует хороший и альтернативный способ последовательного запуска ряда команд из истории 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 - это nash bash, который пропускает шаг «открыть в редакторе», который хочет 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 на терминал, пригодные для последующего копирования / вставки.