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


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.