it-swarm.cn

在终端中意外按下Ctrl-S后如何解冻?

这种情况在我身上经常发生:在我按下(意图不同)之后 Ctrl-S 在终端中,与之的交互(输入或输出)被冻结。这可能是一种“滚动锁定”或其他任何一种。

此后如何解冻终端?

(这一次,我一直在bash内的urxvt内使用apt-Shell,但不确定是哪个对特殊处理负责 Ctrl-S:我正在向后搜索命令的历史记录 C-r,就像readline一样,但是后来我想像往常一样(至少在Emacs中)“回顾”历史C-s ( 12 ,),但这导致终端冻结。好了,滚动/分页以查看过去的内容仍然可以在终端中运行,但是与在此运行的进程没有交互。)

772

Ctrl--Q

要完全禁用此功能,请粘贴stty -ixon在启动脚本中。要让任何键重新使事情顺利进行,请使用stty ixany

ps:执行此操作的不是终端也不是Shell,而是操作系统的终端驱动程序。

924
ak2

Ctrl--Q 确实是答案。我以为我会花一点时间来解决这个问题,因为它太长了,无法满足 ak2的正确答案 的空白。

早在黑暗时代,终端就是通过长线或通过调制解调器的电话线连接到远程设备(起初是另一个终端,因为电传打字比电报键更容易学习)的大型设备。到Unix开发之时,ASCII)代码已经很成熟了(尽管来自IBM的EBCDIC竞争代码仍然不容小force)。

最早的终端保留了每个收到字符的打印记录。只要字符到达的速度至少不超过打印头可以键入的速度。但是,一旦基于CRT的终端成为可能,就会出现一个问题,即CRT上只能容纳25行,而25行80个字符代表足够RAM,没有人认真考虑过提供更多= RAM用于滚动到屏幕顶部之外的字符。

因此,需要采取一些惯例来表示发送端应暂停以使阅读器跟上。

7位ASCII代码有33个代码点专用于控制字符(0到31和127)。其中一些代码点确实具有明确的用途,例如NUL(空白纸带头,用于穿线,缝隙和接头),DEL(在纸带上打出所有七个孔表示“划线”字符),BEL(丁!),CRLFTAB。但是显式定义了四个,用于控制终端设备本身(DC1DC4 aka Ctrl + Q,Ctrl + R,Ctrl + S和Ctrl + T)。

我最好的猜测是,一些工程师认为(随着助记符的发展),“ S”代表“ Stop”,“ Q”代表“ Continue”并不太差,并分配了DC3表示“请停止发送”和DC1的意思是“确定,请立即发送”。

甚至在Unix离开Bell Labs进入世界时,这种约定已经很好地确立了。

该约定称为软件流控制,在实际的串行设备中极为常见。正确实现并不容易,因为它会阻止将这些字符中的任何一个用于通信信道中的任何其他目的,并且必须在任何未决的已接收字符之前处理停止信号,以避免发送超出接收端能力的字符。处理。

如果可行,使用串行数据流的带外附加信号进行流量控制是非常可取的。在可以负担额外信号线的直接有线连接上,您会发现正在使用硬件握手,这可以释放这些字符以供其他用途。

当然,今天的终端窗口没有使用实际的物理串行端口,没有滚动条,并且根本不需要软件握手。但是惯例仍然存在。

我记得理查德·斯托曼(Richard Stallman)在emacs的第一个发行版中就收到了有关将Ctrl + S映射到增量搜索的投诉,并且他对必须依赖7位软件流控制连接的任何用户都不感同情。

412
RBerteig