284

Могу ли я искать историю в bash и запустить результат?

10 ответов10

410

Введите Ctrl R в командной строке и начните вводить предыдущую команду. Когда появится результат, продолжайте нажимать Ctrl R, чтобы увидеть другие совпадения. Когда появится нужная команда, просто нажмите Enter

Обратите внимание, что хотя Ctrl R является значением по умолчанию, если вы хотите, чтобы команда (reverse-search-history) была привязана к Ctrl T, вы можете настроить это следующим образом:

bind '"\C-t": reverse-search-history'

Существует целый ряд других привязываемых команд readline, которые также доступны для вас. Взгляните на страницу руководства bash.

Bash имеет много возможностей для поиска и доступа к интерактивной истории команд. Самым основным из которых является встроенная history . Набрав просто:

$ history

Напечатает список команд вместе с числовым индексом, например:

$ history
1 clear
2 ls -al
3 vim ~/somefile.txt
4 history
$

Затем вы можете выполнить любую из этих команд, используя их числовой индекс, предварительно указав один ! Митч отметил:

$ !1

Выполнит команду clear . Встроенная история имеет много функций, вы можете увидеть больше на страницах руководства по bash и history .

Вы также можете указать относительные отрицательные смещения при использовании ! обозначение, поэтому, используя наш список истории выше, если мы хотим снова выполнить vim , мы можем сделать:

$ !-2

Что в основном говорит bash выполнить команду, которую вы выполнили «две команды назад». Чтобы запустить предыдущую команду в списке истории, мы можем просто использовать !! (это просто сокращение от !-1).

! Обозначение не ограничивает вас числовым указанием команды для запуска. Хаялчи показал, что вы можете дать команду bash выполнить команду на основе любого текста, с которого она начинается (используя !) или текст внутри самой команды (используя !?). Опять же, используя наш примерный список истории выше, если мы хотим снова выполнить clear , все, что нам нужно сделать, это набрать:

$ !cl

и нажмите Enter. А что насчет vim? Это так просто, как:

$ !?some

Самым важным моментом в ответе Хаяльчи является вызов встроенного shopt :

$ shopt -s histverify

Это включит проверку истории, так что команды, которые соответствуют ! !! , а !? указатели не выполняются вслепую, а вместо этого вводятся в командной строке, чтобы вы могли убедиться, что они не причинили вреда, прежде чем выполнять их. Это еще более важно, когда вы выполняете команды от имени пользователя root. Эта опция может быть установлена в вашем файле запуска .bashrc так что она устанавливается при каждом входе в систему.

Как уже указывалось, всю эту информацию можно почерпнуть из справочной страницы bash. Для!, !!, и!? указатели, взгляните на Раздел 9.3 Расширение истории.

36

В качестве альтернативы crtl+R вы можете искать историю, набрав

!text

Это будет искать в истории самую последнюю команду, начинающуюся с 'text'.

Но я предлагаю вам поместить это в ваш .bashrc, чтобы предотвратить выполнение неправильной команды.

shopt -s histverify

Это указывает bash на то, что после любых действий в истории (например, !!:s/prev_text/after_text) он помещает полученную строку в командную строку. Затем вы можете просмотреть или отредактировать команду и затем нажать Enter.

30

Вы также можете сделать:

history | grep "stuff"

это вернуло бы что-то вроде

num stuff

тогда вы можете напечатать

!num
14

Я предпочитаю использовать историю поиска назад, а не историю поиска назад. Первый позволяет ввести несколько символов команды, а затем нажать клавишу поиска, вместо того, чтобы сначала нажать клавишу поиска, а затем ввести строку поиска.

По умолчанию в моей системе Mp и Mn связываются с похожими функциями, но я предпочитаю связывать клавиши со стрелками:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
12

У меня действительно отличный псевдоним, ч. Это на самом деле просто «history | grep», но я отфильтровываю предыдущие записи "h command" с помощью «grep -E -v»

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

используется как

h aliases
2003  less .bash_aliases
12

Отличная рецензия, Шон! Я бы поставил это в комментарии, но я несколько застенчивых очков репутации. :-)

Другая связанная и полезная техника - это возможность выполнить предыдущую команду при смене слова. Допустим, вы указали имя каталога или хотите изменить имя файла:

$ echo my name is bob
my name is bob
$ ^bob^jordan
echo my name is jordan
my name is jordan

Обратите внимание, что команда расширяется, заменяется и выводится до ее запуска, поэтому, если запущена неправильная команда, вы можете увидеть, что думает bash.

5

Поскольку навигация по истории с использованием Ctrl-r является IMO громоздкой, вы можете рассмотреть hh:

https://github.com/dvorka/hstr

что делает навигацию намного проще, понятнее и эффективнее, включая запуск команды:

3

В командной строке bash введите control-R, затем введите несколько символов нужной вам команды, и средство чтения bash будет искать в истории команд эту команду.

После того, как вы начали поиск, вы можете снова нажать control-R, чтобы перейти к следующей соответствующей команде.

3

Если ваша оболочка настроена на использование привязок клавиш vi (set -o vi или set editing-mode vi в $HOME/.inputrc), тогда вы выполните поиск с помощью <Esc>/some-command<Return> и нажмете n (далее) ) или Shift-n (предыдущий) для циклического просмотра истории командной строки.

2

CTRL+R работает просто отлично, как предложил @ John1024, но несколько утомительно, если многие из ваших недавних команд похожи, и вы хотите быстрый способ отсканировать их все. Альтернативой было бы использовать history:

$ history | grep keyword

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .