sqlplus退格变^H、方向键失灵是因原生版本无readline支持,需用rlwrap包装解决;安装时须先装readline-devel等依赖,正确配置alias并刷新环境变量。
sqlplus 启动后退格键变 ^h、方向键按了没反应,甚至输入命令时出现乱码——这不是 oracle 19c 的 bug,是它默认不带行编辑支持。linux 终端的键盘交互能力(如历史回溯、字符删除)由底层 readline 库提供,而原生 sqlplus 是静态链接的古老二进制,压根没集成这个功能。
安装 rlwrap 是最直接有效的补救方式
rlwrap 是一个轻量级包装器,它在 sqlplus 外面加了一层“ readline 代理”,把终端输入/输出劫持过来,自己处理退格、上下箭头、Ctrl+A/E 等操作,再把干净的命令行传给 sqlplus。它不改 Oracle 任何文件,也不需要重启监听或数据库实例。
- 必须以
root身份安装,因为要写入系统级路径(如/usr/local/bin) - 安装前必须先装好
readline-devel(不是readline),否则./configure会报错 “readline not found” -
libtermcap-devel或ncurses-devel也常被需要,尤其在 CentOS 7/8 和 Rocky Linux 上;RHEL 9+ 可能用ncurses-devel替代 - 不要用
yum install rlwrap直接装(某些仓库版本太老,对 UTF-8 或宽字符支持差,反而导致中文乱码)
配置 alias 时路径和引号容易出错
很多用户执行完 make install 就以为完事了,结果 alias sqlplus='rlwrap sqlplus' 一运行就报 command not found: rlwrap,原因通常是:
-
rlwrap被装到了/usr/local/bin/rlwrap,但当前$PATH没包含该路径 -
.bash_profile里写了alias sqlplus="/usr/local/bin/rlwrap sqlplus",但漏了引号,空格被 shell 当成分隔符 - 写成了单引号:
alias sqlplus='/usr/local/bin/rlwrap sqlplus'—— 单引号会抑制变量展开,虽不影响本例,但若后续加$ORACLE_HOME就会失效 - 改完
.bash_profile没执行source ~/.bash_profile,或者开了新终端却没重新登录oracle用户
正确做法是:
- 先确认
rlwrap是否可用:which rlwrap或/usr/local/bin/rlwrap --version - 在
/home/oracle/.bash_profile末尾添加:alias sqlplus='rlwrap sqlplus' alias rman='rlwrap rman'
- 运行
source ~/.bash_profile,再新开一个终端验证
rlwrap 对 rman 和 lsnrctl 同样有效
rman 和 lsnrctl 也有完全一样的问题:无历史、无退格、上下键失效。它们和 sqlplus 属于同一类 Oracle 命令行工具,所以解决逻辑一致:
- 一起加进
.bash_profile:alias rman='rlwrap rman' alias lsnrctl='rlwrap lsnrctl'
- 如果你用的是 Oracle 19c 的
orapki或adrci,也可以同样包装,但注意部分工具内部已有简单行编辑(如adrci),包装后反而可能冲突,建议先试不加rlwrap版本
真正容易被忽略的是:一旦用了 rlwrap,sqlplus /nolog 启动后的提示符颜色、多行粘贴行为、甚至 Ctrl+C 中断当前输入的响应时机,都会略有变化。这不是故障,是 rlwrap 自己接管了信号处理 —— 如果你在脚本里依赖原始 sqlplus 的 SIGINT 行为,就得小心测试。











