一次偶然,在Git bash窗口中复制一些信息,切回来之后发现,居然无法打字了,而按回车却有反应。一番搜索之后,也算是找到了解决方案。输入reset 然后回车
摘录自网上的Root cause:
当运行shell或shell中的大多数程序时,您输入的任何内容都会通过内核的TTY子系统返回到用户的终端。对于擦除字符,Ctrl+R,Ctrl+Z等等,还有其他特殊的处理方式。
某些程序,特别是从命令行运行的程序(特别是编辑器)不需要或不想这样做。出于这个原因,他们用IOCTL调用TY(终端)设备向内核发出信号,表示他们不希望出现这种行为。他们也不想让特殊人物做特别的事情。相反,他们要求内核采用“原始”模式。特别是,编辑器的VIM关闭了各种“回显设置”。所有这一切都适用于计算机串行线上的真实TTY终端,或Alt+Ctrl+F1上的虚拟终端,或者当您在GUI下运行GNOME终端时得到的真正的虚拟终端。
这些程序应该通过输入退出编辑器命令或接收信号(例如来自Control+C)来重置它们在退出之前正在使用的虚拟TTY上更改的任何模式。
如果他们不能正确地做到这一点,那么TTY就会处于你所发现的有趣的状态中。由于程序可能无法重置终端,
reset
命令以允许用户恢复。我假设中断干扰了您正在运行的python软件。我猜该程序没有机会重置终端,或者根本没有这样做。
在VIM情况下,当我运行您的示例时,我得到了您描述的相同的行为。我还看到一条消息“Vim:警告:输入不是来自终端”(当您重置时它就消失了)。这是因为VIM不是通常从shell启动的。相反,“grep”和“xargs”命令一直在使用标准输入(通常由TTY占用),以便将文件名从
grep
托xargs
.在发布的输出中
stty -a
我们可以看到“-回声”,也证实了这就是问题所在。如果您要杀死VIM,使其无法优雅地处理信号,您可能会看到同样的问题。VIM案例的一个解决方案是避免使用xargs,而是使用:
vim $(grep foo * -l)
在这里,文件列表是由shell构造的,就像以前由xargs构造的那样,但是shell正在调用vim,它直接连接到TTY。有发送到错误输出文件的警告消息,并且vim正确地设置和重置TTY设置。
貌似不止一种方法
1、 reset
2、stty sane (保留之前的内容)