Клавиши курсора и поиск по истории команд не работают в SQL*Plus и RMAN

Часто приходится пользоваться в консоли SQL*Plus и RMAN для администрации БД.
В консоли настроен readline для быстрого перемещения курсора в строке ввода и поиска по истории выполненых команд.

Но если запустить в консоли SQL*Plus, то клавиши курсора не работают, например стрелка-влево:

SQL> select ffiel^[[D

Соответственно, нет возможности выполнить передвижение и поиск по истори команд.

Как можно решить проблему?


Ответы (2 шт):

Автор решения: 0xdb

Командная строка 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.

→ Ссылка
Автор решения: 0xdb

Поведение аналогичное 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;
→ Ссылка