История перезапуска Bash: возможная команда, чтобы избежать использования! Bang !? - PullRequest
4 голосов
/ 10 марта 2009

Сценарий:

Вы делаете свои ежедневные вещи из оболочки Bash. Вы хотите выполнить предыдущую команду, набрав:

history | grep foocommand

Затем вы получите список всех foocommand вещей, которые вы делали, сколько бы ваша история ни отслеживала, в таком списке:

  585 foocommand --baz --bleet
  750 foocommand | grep quux
  987 history grep | foocommand

Вы решили, что хотите запустить команду 585, поэтому вы набираете

  !585

Вопрос: Просто для любопытства, есть ли способ сделать этот последний шаг из уравнения и все же получить ожидаемый результат? Было бы неплохо, если бы был способ сказать:

 "grep through history and automatically run the first item on the list"

или

"grep through history and let me choose which item to run using the arrow keys"

Ответы [ 5 ]

5 голосов
/ 10 марта 2009

Нажмите ^r (это CTLR-r), введите foocommand нажмите Enter;) Это будет искать историю и показать последнюю соответствующую запись

3 голосов
/ 10 марта 2009

Вы пробовали '! F'? 'f' как первая буква foocommand.

1 голос
/ 11 марта 2009

Лично я использую псевдоним, полученный из ksh:

alias r="fc -e -"

('r' для 'rerun', я полагаю ...)

Я могу выполнить последнюю команду, начиная с 'foo':

r foo

Я могу выполнить команды с 46 по 50:

r 46 50

Я могу повторить команду 585:

r 585

Единственная ошибка в том, что если вы набрали:

$  cd somewhere

тогда выполнение 'r cd' не будет работать, потому что перед командой 'cd' было дополнительное пространство. Команда 'fc' лежит в основе истории, и вы можете отредактировать команды с 46 по 50, прежде чем перезапускать их, набрав:

fc 46 50

и т. Д. Для других вариантов.

('-e -' в псевдониме означает 'редактировать с помощью нулевого редактора'; вы можете написать 'fc -e vim' для редактирования с помощью vim, но большинство людей устанавливают VISUAL или EDITOR или FCEDIT или все три для в этом нет необходимости.)

В остальном, будучи человеком 'vim' (фанатик?), Я использую 'set -o vim', а затем средство поиска: ESC и

/grep\ -e\ 'whatever

для поиска в истории команды, содержащей "grep -e 'что угодно". Я могу повторить поиск, переместившись еще дальше назад в истории или в обратном направлении после выброса, или ... я предполагаю, что в режиме emacs есть эквивалентный механизм поиска.

1 голос
/ 10 марта 2009

Синтаксис

!foo

запустит последнюю команду, которая началась с foo.

В противном случае bash использует библиотеку readline для ввода, которая поддерживает команды history-search-forward и history-search-backward, которые можно привязать к клавишам по вашему выбору. Я отредактировал свой файл ./inputrc, чтобы связать их с F8 и Shift-F8, чтобы они работали как эквивалентная функция Windows в консоли при подключении к PuTTY:

"\e[19~":history-search-backward
"\e[32~":history-search-forward
0 голосов
/ 10 марта 2009

"просмотреть историю и автоматически запустить первый элемент в списке"

Хорошо.

`history | grep foocommand | head -1 | tr -s ' ' | cut -d ' ' -f 3-`

Попробуйте, это работает как чемпион!

...