Короткий ответ заключается в том, что вы можете не использовать регулярные выражения для поиска в истории оболочки. Согласно POSIX (стандарт для Unix-подобных операционных систем), вы должны иметь возможность выполнять поиск с использованием обычного сопоставления с шаблоном оболочки (как используется для подстановки имен файлов и с case
заявления). Эта функция называется неинкрементным поиском , но в настоящее время она, похоже, неправильно реализована в Bash.
Спецификация POSIX для оболочки Редактирование командной строки (режим vi) утверждает, что эти шаблоны поиска должны использовать обычное сопоставление с шаблоном оболочки. Хотя метасимвол ^
используется для сопоставления начала строки, это не регулярные выражения.
/ pattern
Перемещение назад по истории команд, поиск указанного шаблона , начиная с предыдущей командной строки. Шаблоны используют нотацию сопоставления с образцом , описанную в Нотация сопоставления с образцом , за исключением того, что символ '^' имеет особое значение, когда появляется {{1 }} как первый символ шаблона . В этом случае '^' отбрасывается, и символы после '^' должны совпадать только в начале строки . Команды в истории команд должны рассматриваться как строки, а не как имена файлов .
Bash использует библиотеку GNU Readline для обеспечения своих возможностей интерактивного редактирования строк и поиска в истории.В официальной документации библиотеки Readline больше внимания уделяется режиму Emacs, но в небольшом разделе в ее руководстве Режим Readline vi говорится, что
Хотя библиотека Readline не имеет полного набора функций редактирования vi, в нем достаточно, чтобы можно было просто редактировать строку.
Режим Readline vi работает в соответствии со стандартом POSIX.
После ряда экспериментов на двух разных системах я обнаружил, что неинкрементный поиск в Bash / Readline не работает так, как описано в его официальной документации. Я обнаружил, что *
обрабатывается как буквальная звездочка, а не как шаблон, который соответствует нескольким символам. Аналогично, ?
и [
также обрабатываются как буквальные символы.
Для сравнения я попытался использовать режим Vi в tcsh
и убедился, что он правильно реализует поиск в истории, как указано в стандарте POSIX.
Затем я загрузил и просмотрел код библиотеки Readline и обнаружил, что ее функции поиска в истории используют простой поиск по подстроке и не используют никаких метасимволов поискового шаблона - кроме каретки, ^
(см. search.c из репозитория git для библиотеки Readline).
Я полагаю, что разработчики Bash / Readline еще не реализовали эту функцию. Я не смог найти список ошибок, но файлы CHANGES
показывают, что они регулярно исправляли проблемы, связанные с режимом Vi.