Клавиши курсора и поиск по истории команд не работают в SQL*Plus и RMAN
Часто приходится пользоваться в консоли SQL*Plus и RMAN для администрации БД.
В консоли настроен readline для быстрого перемещения курсора в строке ввода и поиска по истории выполненых команд.
Но если запустить в консоли SQL*Plus, то клавиши курсора не работают, например стрелка-влево:
SQL> select ffiel^[[D
Соответственно, нет возможности выполнить передвижение и поиск по истори команд.
Как можно решить проблему?
Ответы (2 шт):
Командная строка SQL*Plus и других инструментов не использует readline. В этом случае следует воспользоваться утилитой rlwrap (readline wrapper).
DESCRIPTION
rlwrap runs the specified command, intercepting user input in order to provide readline's line editing, persistent history and completion.
Она уже включена в большинство дистрибутивов Linux и может быть установленна доступным в них менеджером пакетов, например:
apt-get install rlwrap
Также, можно установить вручную с GitHub. После установки надо маскировать вызов оригинальных программ, например, добавив в конфигурационные файлы оболочки консоли:
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
Теперь клавиши курсора будут выполнять функции настроенные в файле ~/.inputrc.
Поведение аналогичное readline было предложено ввести для командной строки в SQL*Plus.
Начиная с версии 12.2 доступна команда HIST[ORY]. Но как и попрежде, клавишы курсора недоступны и rlwrap остаётся предпочтительным решением.
Чем же может быть полезна новая команда по сравнению с rlwrap. Поиск и редактирование многострочных SQL запросов было и остаётся с rlwrap сложной задачей, т.к. он запоминает историю ввода построчно. Команда HIST[ORY] позволит найти в истории выполненый ранее сложный запрос, отредактировать его в редакторе указанным в переменной окружения EDITOR, и сохранить в истории.
SQL> set hist on
SQL> select 1
2 from dual;
SQL> select 1
-- ^--здесь нажата <C-Up> - rlwrap дополнил из истории только 1 строку
SQL> hist
1 select 1
from dual;
SQL> hist 1 edit
SQL> hist
1 select 1
from dual;
2 select 2
from dual;