Лучший способ поиска по истории оболочки

78

Есть ли лучший способ поиска команды в моем файле истории, чем grep? У меня есть некоторое представление о том, с чего начинается команда, но я не знаю, как далеко она зашла в историю.

update: раньше был специфичен для zsh, но из-за перекрывающихся ответов не стесняйтесь отвечать здесь за любую оболочку (или режим (vi / emacs)), просто отметьте, если она специфична.

xenoterracide
источник

Ответы:

73

Ctrl+ Rобычно лучший способ, как сказал дескриптор . Вы также можете использовать !string, которая запускает самую последнюю команду, начиная с string, или !?string?, которая запускает самую последнюю команду, которая содержит string.

(Я думаю, что это единственное, что относится к этому вопросу, но я рассмотрел гораздо больше команд истории в этом ответе )

Михаил Мрозек
источник
4
как сделать так, чтобы ctrl + r выглядело так?
ксенотеррацид
13
@xen <kbd>Ctrl+R</kbd>. источник ответа
Михаил Мрозек
Я не понимал, что двигатель SE принял любое спасибо HTML.
ксенотеррацид
Я не знал, что ключевое слово kbd будет правильно интерпретировать "ctrl" и "+"! Раньше я отмечал каждую клавишу отдельно. Спасибо!
Оливье Дюлак
2
@OlivierDulac К сожалению, это не так, просто я привык форматировать ключи; кто-то отредактировал мой ответ позже, чтобы сделать их отдельными ключами
Майкл Мрозек
30

При использовании Bash введите Control-, Rа затем начните вводить. Набор текста Control- Rнесколько раз после ввода текста вернет вас обратно в соответствующие командные строки.

Грендель
источник
18

Не уверен, что это поможет, но мне нравится использовать ctrl- rи затем начать вводить команду. Он должен пройти через вашу историю и представить вам первый матч. Для переключения между матчами просто нажмите ctrl- еще rраз.

decriptor
источник
2
Извините, забыл про зш. Возможно, вам придется добавить эту привязку клавиш к вашему ~ / .zshrc: bindkey '^ R' history-incremental-search-backward
decriptor
17

Если вы добавите следующее к ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

и перезапустите Bash, вы можете начать печатать, а затем использовать Page Upи Page Downдля перемещения назад и вперед по истории строк, начинающихся с того же префикса, который вы только что набрали.

(Некоторые могут предпочесть использовать \e[Aи \e[B, который заменит обычные Upи Downдействия вместо привязки новых ключей.)

ephemient
источник
Я предпочитаю сопоставлять эти команды Alt + Upи Alt + Down. В зависимости от эмуляции клавиатуры, которую использует эмуляция терминала, эти комбинации могут быть сопоставлены либо с \E[Aи \E[A(например, KDE Konsole с привязками клавиш Linux), либо \E[1;3Aи \E[1;3B(например, XFCE Terminal или KDE Konsole с привязками X Free 4).
Кристиан Херенц
9

Интерактивная подсказка, вызываемая Ctrl- R, как уже упоминалось, является наиболее удобным способом. Кроме того , он популярен переназначить Upи Downклавиши со стрелками для поиска истории для префикса в настоящее время в командной строке, однако это требует некоторых изменений в ~/.inputrcфайл .

Классическое и менее интерактивное решение - использовать расширение истории оболочки. Typing

!foo

выполнит последнюю команду, которая начинается с fooи

!?foo

выполнит последнюю команду, которая содержит foo. Более подробную информацию о расширении истории можно найти в справочном руководстве по Bash , если ваша оболочка Bash или совместима.

Адам Быртек
источник
6

Если вы добавите stty -ixonв свой ~/.bashrcфайл, то Ctrl- sбудет идти в направлении, противоположном Ctrl- r.

Деннис Уильямсон
источник
Я хотел использовать C-sдля этой цели, но мой терминал завис ; берегитесь! (Ну, я еще не нанял никого stty ixon, не уверен, для чего это
нужно
3
@imz: C-qбудет "разморозить". Это и C-sесть обычные программные символы управления потоком, которые когда-то были полезны для ручного прерывания (приостановки) потока вывода при использовании медленных последовательных соединений. Теперь вывод в большинстве случаев настолько быстр, что то, что вы хотите видеть при нажатии C-s, уже прокручивается. stty -ixonотключает программное управление потоком.
Деннис Уильямсон
Фантастика! Я годами искал способ прокрутить историю вперед, как это.
Marlar
3

Если вы напечатаете, !lsbash просмотрит вашу историю и выполнит самую последнюю команду, которая начинается с «ls»

Кевин М
источник
2

может быть специфичным для Zsh. Исследуя этот ответ, я нашел, vi-history-search-backward что позволяет искать /в режиме vi (в котором я не упомянул, что я был), вы можете затем использовать nи Nдля поиска вперед и назад соответственно (после нажатия enter).

xenoterracide
источник
2

Я удивлен, что это не было упомянуто - но вы можете выбрать vi-mode в bash или ksh, выполнив это:

set -o vi

... или используя это как содержимое ~/.inputrc(для GNU readline, используемого в таких программах, как bash):

set editing-mode vi

Затем, после этого, вы можете использовать, Escчтобы войти в командный режим и использовать, kчтобы вернуться в историю и jперейти вперед. Вы также можете выполнять поиск с помощью /обычного поиска и ?обратного поиска.

Если вы используете ~/.inputrc, то это будет работать не только в GNU bash, но и во всем, что использует GNU readline, например CLISP, и, возможно, в таких программах, как командная оболочка MySQL и оболочка CPAN.

Mei
источник
2

Для переключения вперед при использовании обратного поиска (с помощью команды Ctrl-R):

  1. Откройте файл .bashrc:
    sudo gedit ~/.bashrc

  2. добавить эту строку (буква "f" может быть заменена другой, еще не используемой системой)

    bind '"\C-f": forward-search-history' 
  3. Закройте ваш файл и обновите ваш .bashrc (или откройте другой терминал) с помощью команды:
    source ~/.bashrcили. ~/.bashrc

ТЕПЕРЬ ВЫ МОЖЕТЕ ДВИЖИТЬСЯ В ИСТОРИЮ С ИСТОЧНИКОМ: Ctrl + F

Работа над Ubuntu 18.04 LTS

Франклин ЧАТАТ
источник
1

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

  1. tcsh : введите несколько символов команды, затем Esc+ pотобразится предыдущая команда, начинающаяся с этой последовательности клавиш; нажмите ее еще раз, чтобы отобразить другую команду.
  2. ksh : использование fc -e - <SPACE> <first few char for your previous >этого запускает последнюю команду, соответствующую этой последовательности.

Я не смог найти что-то вроде Ctrl+ Rв Bash для моих ksh и tcsh.

Hemant
источник
3
Ctrl + r работает немного иначе в Ksh, чем Bash. Нажмите Ctrl + r, затем введите искомую строку и нажмите ввод . Чтобы найти то же самое, нажмите Ctrl + r и введите без повторного ввода строки. Это в set -o emacsрежиме, кстати.
Деннис Уильямсон
@Dennis: +1 :-)
Hemant
1

Есть способ использовать Ctrl- Rс tcsh . Добавьте следующее в ваш ~/.cshrc:

bindkey "^r" i-search-back (это просто знак каретки и буква г)

Это самая большая экономия времени для меня.

большой нос
источник
1

аналогичный ответ на @ephemient, но вы можете поместить в свой .bashrc

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

и введите часть фразы, а затем используйте стрелки вверх / вниз, чтобы просмотреть самые последние варианты, которые соответствуют. Это поведение по умолчанию в Matlab.

Для большинства людей, если вы хотите перенести свои настройки на новую систему, легче не забыть зацепить только ~/.bashrcто, что вам нужно зацепить, что~/.inputrc

Мэтт С.
источник
0

Да, он существует, по крайней мере, если вы используете Zsh. Просто начните вводить команду, а затем нажмите M-p( ESC p), и она найдет предыдущие команды, которые соответствуют введенному вами. Нажмите еще раз, чтобы найти следующий матч.

dkagedal
источник
Этот ответ можно сделать с большим количеством объяснений.
phunehehe