Поиск истории Bash, частичное + стрелка вверх


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

Ответы:


197

Поместите следующие строки в свой ~/.inputrc:

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

Строки, начинающиеся с #комментариев. Я не могу вспомнить, что назад, а что вперед. Экспериментируйте с этим. Возможно, вам придется переключаться назад и вперед.


Немного справочной информации:

Bash использует readline для обработки запроса. ~/.inputrcэто файл конфигурации для readline. Обратите внимание, что это также вступит в силу в других программах, использующих библиотеку readline, например, IPython .

Прочтите руководство по bash для получения дополнительной информации о readline. Там вы также можете найти больше связанных с историей команд readline .

Чтобы получить коды выхода для клавиш со стрелками, вы можете сделать следующее:

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

1
Отлично, но это решение отключает сочетания клавиш ctrl-left / ctrl-right.
— Eyal

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

@lesmana, я бы дал дополнительные очки только за роль кошки
— Майк Д

После @Eyal, у кого-нибудь есть совет, как мне это сделать, но сохранить сочетания клавиш ctrl-left / ctrl-right?
— kbrose

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

31

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

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

Я думаю, что это лучший способ сделать это. В основном, если вы используете системы управления конфигурациями, такие как chef, puppet и т. Д.

И конфиг системы еще не тронут!


4
Как ни странно, ~ / inputrc у меня не сработал - но помещение этих команд в .bash_profile сработало.
— Джо

1
.inputrc не существует в моей домашней папке, и я все равно предпочитаю иметь такие настройки в .bashrc, так что я могу носить только один файл для своих настроек. Так что это, вероятно, лучший ответ, чем принятый.
— Шиталь Шах

.inputrc работает для меня сказочно, но не после загрузки screen. Странно то, что работают другие ярлыки .inputrc, но не эти. Поэтому сейчас я использую оба решения.
— Орвеллофил

Это очень полезно, когда, например, вы заходите на сервер, чтобы что-то делать, и вам не хватает этого, и вы не хотите редактировать и перезагружать ~ / .inputrc на сервере.
— 17

13

Ctrl + R даст вам такую ​​функциональность. Начните вводить частичную команду, и она найдет старые, которые вы можете перемещать с помощью стрелок вверх и вниз. Дополнительная информация: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Спасибо за ваш ответ. Да, я пробовал это, но я нахожу это немного ... привередливым. Он не позволит мне прокручивать команды, начинающиеся с партиала, он показывает только первую. Он также ищет всю команду в поисках персонажа, что бесполезно.
— TLP

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

4

Чтобы завершить ответ Lesmana относительно "~ / .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/…
— Шиталь Шах,

3

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

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

Он может быть легко связаны с Ctrl-rи / илиCtrl-s


0

Следующее решение объединяет и расширяет некоторые из вышеупомянутых подходов: добавьте следующие строки в ваш ~/.bash_aliasesфайл (без необходимости ~/.inputrc) для достижения следующего поведения:

  1. перемещаться вверх / вниз по истории (только записи с одинаковым префиксом), нажимая CTRL + UP и CTRL + DOWN. Это может сосуществовать со стандартной функциональностью перемещения вверх / вниз по всей истории с помощью UP и DOWN.
  2. перейти к следующему / предыдущему слову в командной строке, нажав клавиши CTRL + RIGHT и CTRL + LEFT
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.