CTRL+R в оболочке - если я пройду мимо нужной мне команды, как мне вернуться к ней?

Я лихорадочно нажимаю CTRL+R, чтобы найти какую-то команду, которую я использовал некоторое время назад, когда внезапно до нее дохожу. По рефлексу я продолжаю нажимать CTRL+R, передавая его для чего-то еще назад в истории оболочки. Как мне вернуться к команде, которую я только что передал, без необходимости начинать весь поиск заново?

1 ответ

Решение

Функцию Ctrl + R для поиска в обратном направлении по истории оболочки обеспечивает библиотека Readline, используемая Bash. Соответствующая функция для поиска в истории по умолчанию связана с Ctrl + S.

Однако проблема заключается в том, что драйвер терминала уже использует эту комбинацию клавиш для управления потоком данных: нажатие Ctrl + S останавливает или приостанавливает печать текста на терминал, а Ctrl + Q возобновляет поток символов, отправляемых на терминальное устройство.

Эти настройки по умолчанию включены для большинства терминальных устройств в системах GNU/Linux, в результате чего Bash/Readline никогда не видит последовательность клавиш Ctrl + S, поскольку она перехватывается драйвером терминала и никогда не передается в оболочку.

Это поведение (также называемое управлением потоком XON/XOFF) можно отключить, выполнив:

stty -ixon

Теперь комбинация клавиш Ctrl + S будет передана в Bash/Readline.

Альтернативная комбинация клавиш

Если вы предпочитаете, чтобы Readline использовал другую комбинацию клавиш для поиска вперед, используйте bind команда для включения другой привязки клавиш, например, Ctrl + F (для пересылки). NB: все кавычки обязательны.

bind '"\C-f": forward-search-history'

Изменить конфигурацию, чтобы сохранить эти изменения

Управление потоком терминала не особенно полезно на современных устройствах, поэтому я бы рекомендовал запускать следующую команду всякий раз, когда запускается новый терминал или псевдотерминальное устройство:

stty -ixon

.bashrc вероятно, будет хорошим стартовым файлом для запуска этой команды, так как файл поставляется для интерактивных оболочек Bash. Если .bashrc не источником .profile или же .bash_profle, выше stty Команда должна быть добавлена ​​к любому файлу запуска, используемому для входа в систему.

Файл конфигурации Readline .inputrc если вы предпочитаете использовать другую привязку клавиш, например Ctrl + F, для поиска в истории:

bind "\C-f": forward-search-history

Ссылки по теме

Другие вопросы по тегам