Найкращий спосіб пошуку в історії оболонки


78

Чи є кращий спосіб пошуку в моєму файлі історії за командою, ніж grep? У мене є деяке уявлення, як починається команда, але я не знаю, наскільки це далеко в історії це.

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

Відповіді:


73

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

(Я думаю, що це єдиний матеріал, що стосується цього питання, але я висвітлив набагато більше команд історії в цій відповіді )


4
як зробити так, щоб "ctrl + r" виглядав так?
ксенотеррацид


Я не розумів, що двигун SE прийняв будь-яке html дякую.
ксенотеррацид

Я не знав, що ключове слово kbd правильно інтерпретуватиме "ctrl" та "+"! Я використовував теги для кожного ключа окремо. Дякую!
Олів'є Дулак

2
@OlivierDulac На жаль, це не так, саме так я використовував для форматування клавіш; пізніше хтось відредагував мою відповідь, щоб зробити їх окремими ключами
Майкл Мрозек

30

Використовуючи Bash, наберіть Control- Rі почніть вводити текст. Введення тексту Control- Rкілька разів після введення деякого тексту поверне вас назад у відповідні командні рядки.


18

Не впевнений, чи це допоможе, але я люблю використовувати ctrl- rі тоді почніть вводити команду. Це має пройти вашу історію та представити вам перший матч. Щоб перемикати сірники, просто натисніть ctrl- rще раз.


2
Вибачте, забув про zsh. Можливо, вам доведеться додати це прив'язку клавіш до своєї ~ / .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дії замість прив’язки нових клавіш.)


Я вважаю за краще вказати ці команди на Alt + Upта Alt + Down. В залежності від емуляції клавіатури терміналу емулювати використовує ці комбінації можуть бути відображені або \E[Aі \E[A(наприклад , KDE Konsole з Linux Key Bindings) або \E[1;3Aі \E[1;3B(наприклад , XFCE Terminal або KDE Konsole з X Free 4 кріплень).
Крістіан Геренц

9

Інтерактивний рядок, на який посилається Ctrl- R, про який вже згадувалося, - це найзручніший спосіб. Крім того, популярним є перенастроювання Upта Downклавіші зі стрілками для пошуку історії префікса, який зараз знаходиться в командному рядку, однак для цього потрібні деякі зміни у ~/.inputrcфайлі .

Класичне та менш інтерактивне рішення - використовувати розширення історії оболонок. Введення тексту

!foo

виконає останню команду, яка починається з fooі

!?foo

виконає останню команду, яка містить foo. Більше інформації про розширення історії можна знайти в довідковому посібнику Bash , якщо припустити, що ваша оболонка є Bash або сумісною.


6

Якщо ви додасте stty -ixonу свій ~/.bashrcфайл, тоді Ctrl- sпіде у зворотному напрямку до Ctrl- r.


Я хотів використовувати C-sдля цієї мети, але мій термінал замерз ; остерігайся! (Ну, я ще не працював ні на кого stty ixon, не знаю, для чого це.)
imz - Іван Захарящев

3
@imz: C-q"розморозить". Це і C-sзвичайні символи програмного забезпечення управління потоком, які колись були корисні вручну переривати (призупиняти) потік виводу при використанні повільних послідовних з'єднань. Зараз виведення настільки швидке в більшості випадків, що те, що ви хочете побачити при натисканні C-s, вже прокручено. stty -ixonвимикає програмне забезпечення управління потоком.
Денніс Вільямсон

Фантастичний! Я роками шукав такий спосіб прокрутити вперед історію, як це.
марбель

3

Якщо ви введете, !lsbash перегляне вашу історію та виконає останню команду, яка починається з "ls"


2

може бути специфічним для zsh. Досліджуючи цю відповідь, я виявив, vi-history-search-backward що дозволяє здійснювати пошук /у режимі vi (у якому я не згадував, в якому я був), то ви можете використовувати nта Nшукати відповідно вперед та назад (після натискання enter).


2

Я здивований, що це не було згадано - але ви можете вибрати ві-режим у bash або ksh, виконавши це:

set -o vi

... або використовуючи це як вміст ~/.inputrc(для GNU readline, що використовується в таких програмах, як bash):

set editing-mode vi

Потім після цього, ви можете використовувати Escдля входу в командний режим і використовувати kдля повернення в історію та jдля переходу вперед. Ви також можете шукати за допомогою /звичайного пошуку та ?пошуку в зворотному порядку.

Якщо ви використовуєте ~/.inputrc, то це буде працювати не тільки в GNU bash, але і в усьому, що використовує лінійку зчитування GNU, наприклад, CLISP і, можливо, таких програм, як командна оболонка MySQL і як оболонка CPAN.


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.


3
Ctrl + r працює в ksh трохи інакше, ніж Bash. Натисніть Ctrl + r, а потім введіть потрібний рядок і натисніть клавішу Enter . Щоб шукати те саме, натисніть Ctrl + r і введіть, не вводячи рядок. Це в set -o emacsрежимі, до речі.
Денніс Вільямсон

@Dennis: +1 :-)
Hemant

1

Є спосіб використання Ctrl- Rз tcsh . Додайте у своє ~/.cshrc:

bindkey "^r" i-search-back (це просто знак карети та літера r)

Це найбільша економія часу для мене.


1

відповідь схожа на @ephemient, але ви можете розмістити її у своєму .bashrc

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

і введіть частину фрази, а потім скористайтеся стрілкою вгору / вниз, щоб переглянути останні параметри, які відповідають. Це поведінка за замовчуванням matlab.

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


0

Так, він існує, принаймні, якщо ви використовуєте zsh. Просто почніть вводити команду, а потім натисніть M-p( ESC p), і вона знайде попередні команди, які відповідають тому, що ви ввели. Натисніть його ще раз, щоб знайти наступний збіг.


Ця відповідь може зробити більше пояснень.
phunehehe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.