Как я могу найти в истории bash и снова запустить команду?

283

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

Richard Hoskins
источник

Ответы:

408

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

Обратите внимание, что в то время как Ctrl р по умолчанию, если вы хотели команду ( 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 ).

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

$ !cl

и нажмите Войти , И что насчет vim? Это так просто, как:

$ !?some

Самый важный момент из hayalci ответом является призыв к shopt встроенная:

$ shopt -s histverify

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

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

Sean Bright
источник
36
+1 Я использую Linux более 12 лет для всех систем. Я не знал, что существует. Хотел бы я +10 как я это пропустил ??
Aiden Bell
Я не обнаружил это, пока не начал регулярно использовать emacs. Затем я случайно набрал его в bash однажды (думая, что я в emacs).
Sean Bright
1
Во многих системах нажатие стрелки вверх делает то же самое.
mas
3
Стрелка вверх для меня просто идет к предыдущей команде. Но да, это все привязано к тому, что вы хотите.
Sean Bright
2
Также после нажатия CTRL + R вы можете использовать CTRL + SHIFT + R несколько раз, чтобы вернуться к предыдущей команде
Gal Bracha
35

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

!text

Это будет искать в истории самую последнюю команду начало с «текстом».

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

shopt -s histverify

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

hayalci
источник
5
Используйте!? Text для повторного выполнения самой последней команды, содержащей (в отличие от начала) текст.
mark4o
3
Если кто-то объединит «!», «!!», «!?», «История | grep 'и' ctrl-r 'в исчерпывающий ответ, я бы выбрал его.
Richard Hoskins
30

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

history | grep "stuff"

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

num stuff

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

!num
Mitch
источник
14

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

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

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Keith
источник
12

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

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

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

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

Jordan
источник
12

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

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

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

h aliases
2003  less .bash_aliases
CurtH
источник
Это также можно сделать, добавив команду в HISTIGNORE,
tanenbring
5

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

https://github.com/dvorka/hstr

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

enter image description here

Martin Dvorak
источник
Как это использовать? Какие клавиши нажать, чтобы увидеть эту картинку?
Nakilon
2
После установки hh вы можете использовать команду hh ИЛИ привязать ее к любому сочетанию клавиш (обычно Ctrl-r), как описано в документации.
Martin Dvorak
это связано с ctrl + r по умолчанию сейчас
Alleo
3

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

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

John1024
источник
3

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

Fernando Basso
источник
Этот самый близкий к vim пользователям.
Gabor Marton
2

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

$ history | grep keyword
Mureinik
источник