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

146

Я искал, но ничего не нашел по этому вопросу. Я ищу функциональность в Bash, используя терминал.

Еще тогда, когда у меня был пользователь в системе Debian, и мой друг настроил меня с удобной функцией поиска по истории (я думаю, что я использовал tcsh тогда), где я набрал бы начало предыдущей команды, нажал стрелку вверх, и это сделало бы поиск, основанный на частичной строке.

Например, если моя история:

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

И я печатаю ., и нажмите стрелка вверх, она покажет мне: ./script.pl arg1. Нажмите еще раз, и он покажет ./script.pl, и т. Д.

Очень похоже, что он будет выполнять grepна .bash_history. Есть ли способ получить эту функциональность?

TLP
источник
возможный дубликат iPython Like Command History для Shell
Марсель Стимберг
1
@Marcel Похоже, что это может быть тот же ответ, я видел это в поиске, но не связал его с моим вопросом, с ключевыми словами iPython и Shell.
TLP
Похоже, это - github.com/zsh-users/zsh-autosuggestions .
ОДС

Ответы:

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.
lesmana
источник
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 и т. Д.

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

user287613
источник
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 .

bcag2
источник
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), чтобы применить изменения.

user27164
источник