未关闭的 IO 资源会扰乱下一个 shell 提示符下的输入

未关闭的 IO 资源会扰乱下一个 shell 提示符下的输入

有时,当我运行一个生成子进程的终端程序时(例如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 忽略该字符串的“宽度”)。

相关内容