Пошук історії башів, частковий + стрілка вгору


146

Я шукав, але нічого не знайшов на цьому. Я шукаю функціональність в bash, використовуючи термінал.

Назад, коли у мене був користувач у системі debian, і друг налаштував мені зручну функцію пошуку історії (я вважаю, що тоді я використовував tcsh), де я набрав початок попередньої команди, натиснувши стрілку вгору, і він би здійснив пошук, спираючись на частковий рядок.

Наприклад, якщо моя історія:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

І я друкую ., і натисніть стрілка вгору, вона покаже мені: ./script.pl arg1. Натисніть його ще раз, і воно показало б ./script.plі т.д.

Дуже хотілося б, щоб він виконував grepна .bash_history. Чи є спосіб отримати цю функціональність?



1
@Marcel Схоже, це може бути та сама відповідь, я це бачив у пошуку, але не пов’язав це зі своїм запитанням, за допомогою ключових слів iPython та Shell.
TLP

Звучить так - github.com/zsh-users/zsh-autosuggestions .
slm

Відповіді:


197

Покладіть у свій рядок наступні рядки ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Рядки, що починаються з #коментарів. Я не можу згадати, що таке відстале, а що вперед. Експериментуйте з цим. Можливо, вам доведеться перемикатися назад і вперед.


Трохи довідкової інформації:

Bash використовує readline для обробки запиту. ~/.inputrc- це файл конфігурації для рядка читання. Зауважте, що це також почне діяти в іншому програмному забезпеченні, що використовує бібліотеку readline, наприклад, IPython .

Прочитайте посібник з bash, щоб отримати докладнішу інформацію про програму readline. Там же ви можете знайти більше команд для читання, пов'язаних з історією .

Для отримання кодів втечі для клавіш зі стрілками ви можете зробити наступне:

  1. Почніть catз терміналу (просто cat, більше ніяких аргументів).
  2. Введіть клавіші на клавіатурі, ви отримаєте такі речі, як ^[[Aстрілка вгору та ^[[Bстрілка вниз.
  3. Замініть ^[на \e.

1
Чудово, але це рішення вимикає ярлики ctrl-left / ctrl-right.
Eyal

Хто-небудь може сказати мені, як я можу досягти того ж, щоб зробити
Хітеш Кумар

@lesmana, я дав би додаткові бали лише за частину кота
Майк Д

Seconding @Eyal, хтось має поради, як я можу це мати, але зберегти ярлики ctrl-left / ctrl-right?
кброзе

6
Щоб зберегти всі параметри за замовчуванням, додайте $include /etc/inputrc, бажано, у перший рядок.
Туліо Касагранде

31

Створіть файл з назвою setup_readline.sh в режимі 644 в /etc/profile.d/ із наступним вмістом, увійдіть і перевірте бажані ключі:

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

Я думаю, що це найкращий спосіб зробити це. Переважно, якщо ви використовуєте системи управління конфігурацією, такі як шеф-кухар, лялька тощо

А конфігурація системи ще недоторкана!


4
Як не дивно, ~ / inputrc не працював для мене, але введення цих команд у .bash_profile так і зробило.
Джо,

1
.inputrc не існує в моїй домашній папці, і я вважаю за краще мати такі налаштування в .bashrc так чи інакше, щоб я міг просто перенести один файл для моїх налаштувань. Тож це, мабуть, краща відповідь, ніж прийнята.
Shital Shah

.inputrc працює чудово для мене, але не після завантаження screen. Цікаво, що інші .inputrc ярлики працюють, але не ці. Тому я зараз використовую обидва рішення.
Орвелофіл

Це дуже корисно, коли, наприклад, ви входите на сервер, щоб виконувати речі, і не вистачає чортовки з них, і не хочете редагувати та перезавантажувати ~ / .inputrc на сервері.
danmactough

13

Ctrl + R надасть вам такий функціонал. Почніть вводити часткову команду, і в ній з’являться старі, за якими можна переміщатися стрілками вгору та вниз. Більше інформації: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Дякуємо за Ваш відповідь. Так, я спробував це, але вважаю це трохи ... вибагливим. Це не дозволить мені прокручувати команди, що починаються з часткової, вона показує лише першу. Він також здійснює пошук у всій команді для символу, який є марним.
TLP

5
@TLP, повторне попаданняCtrl+r
akostadinov

4

Щоб завершити відповідь лесмена щодо "~ / .inputrc", яку я повинен створити під моїм "Trusty 14.04", підтвердіть / додайте в "~ / .bashrc" (перший рядок вже існує в моєму "~ / .bashrc"):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Це вже пояснено французькою мовою https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .


2
Ця команда в основному дає команду bash негайно додати команду до файлу історії, а не чекати закінчення сеансу. Це корисно, якщо у вас багато відкритих терміналів і ви не хочете втрачати історію в одному, але в іншому випадку не потрібно. digitalocean.com/community/tutorials/…
Shital Shah

3

Можливо, ви можете спробувати https://github.com/dvorka/hstr, що забезпечує просту та багаторядкову просту фільтрацію історії Bash, яка як на основі показників (коли, як часто і тривалість команд має значення) - ви можете використовувати клавіші зі стрілками для легкого переміщення по історії:

введіть тут опис зображення

Він може бути легко пов'язаний з Ctrl-rта / абоCtrl-s


0

Наступне рішення поєднує і розширює деякі з вищезазначених підходів: додайте наступні рядки до вашого ~/.bash_aliasesфайлу (не потрібно ~/.inputrc), щоб досягти наступної поведінки:

  1. переміщення вгору / вниз в історії (лише записи з тим самим префіксом), натискаючи CTRL + UP та CTRL + DOWN. Це може співіснувати зі стандартною функціональністю переміщення вгору / вниз у всій історії лише вгору та вниз
  2. перейти до наступного / попереднього слова в командному рядку, натискаючи CTRL + Вправо і CTRL + Вліво
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Повторно увійдіть в оболонку (або запустіть source ./bash_aliases), щоб застосувати зміни.

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