有时,当我运行一个生成子进程的终端程序时(例如IO.popen
在 Ruby 脚本中),如果子进程的 IO 句柄没有正确清理(例如IO.close
),那么当程序退出并出现新的 shell 提示符时,我发现我的终端输入无法正常工作。
例如,箭头键和元或 ctrl 修改击键,而不是触发我配置的键绑定,而是将转义序列(例如^[<key>
)输出到终端提示符。例如,如果我点击<M-o>
三次,它看起来像:
$ ^[o^[o^[o
在此状态下,按下<C-c>
会创建一个不再有此问题的新提示。因此,由于前一个进程终止时未关闭 IO 资源,我的终端似乎处于奇怪的状态。有人可以解释到底发生了什么吗?
答案1
这听起来像 xterm,还有 bash。这默认 bash 配置设置元模式,并且某些程序将其关闭(均通过转义序列),并且 bash 的内置重置将恢复它。
您可以通过发送以下结果来使其按您想要的方式工作
tput smm
在你的提示字符串中(通常需要注意的是它必须被括起来\[
并\]
告诉 bash 忽略该字符串的“宽度”)。