如何修复终端输出乱码及箭头键异常问题
解决办法
- 若能修改脚本,在末尾添加
stty sane命令,可快速将终端重置为正常状态,相比reset更轻量(reset会清屏并重置更多终端属性)。 - 若无法修改脚本,执行完后手动输入
stty sane或reset命令,终端即可恢复正常。 - 也可以用
script命令包裹执行,避免终端状态被修改:
该命令会在子shell中执行脚本,执行完成后自动恢复原终端状态。script -q /dev/null ./script.sh
原因与最小复现
原因
终端默认工作在cooked模式(规范模式),此模式下Shell会自动解析键盘输入的转义序列(比如上箭头对应调用历史命令)。你的脚本调用的第三方代码可能修改了终端模式,比如切换到raw或cbreak模式(这类模式下终端会直接传递原始输入,不做解析),且程序退出时未将终端重置回原模式,导致后续Shell无法正确处理键盘输入,直接输出转义码(^[OA就是上箭头对应的ANSI转义序列)。
最小复现
用以下简单脚本即可复现问题:
#!/bin/bash # 修改终端为raw模式,不重置直接退出 stty raw
执行该脚本后,按上箭头就会看到类似的转义码输出,手动执行stty sane即可恢复。
你提到的JavaScript库引发该问题,大概率是它在通过STDOUT通信时误修改了终端属性,或是启动的子进程异常退出、未正确清理终端状态。
内容的提问来源于stack exchange,提问作者Christopher Rybicki
相关产品推荐
相关产品推荐

