根据GNU 文档,有一个字符VREPRINT
或rprnt
,这应该重新打印 shell 的行编辑器的输入缓冲区。如果在您输入另一个命令时,某个后台进程之类的东西已经写入 PTY,并且输出与您的输入交织在一起,那么这可能会很有帮助。但是,我尝试实际使用它,但似乎没有效果。我做了以下操作:
sh
在 Dockerhub 的最新镜像上运行会话alpine
。- 使用
stty
将角色绑定rprnt
到^N
。 - 输入一些内容
- 从单独的会话写入第一个会话的 PTY。
- 尝试按 ctrl-N 重印我的输入
我期望它刷新我的输入并删除已写入的输出。然而,没有任何效果。仍有输出扰乱我的行编辑器。我已验证了这一点,icanon
并iexten
已在此 PTY 上进行设置。
答案1
我假设您的 shell 是bash
或其他具有全功能行编辑功能的 shell。
这些 shell 在等待您输入命令时,将 tty 模式设置为原始模式而不是规范模式,因此该rprnt
设置不适用于它们。
命令行工具stty
不会报告此情况,因为这些 shell 在行编辑期间会来回切换设置,而不是运行所请求的外部程序(例如stty
它本身)。您可以通过stty -a < /dev/pts/[this-terminal's-number]
在此终端处于提示符下时从另一个终端运行来确认这一点。
选择一个可以不是具有全面的行编辑功能,例如cat
或dash
类似功能。您会发现,stty rprnt ^N
预先发出并按下^N
确实会重新打印给定的行。至少我已经验证过,它对我来说是有效的。
对于具有强大行编辑功能的 shell,您必须查阅给定 shell 的文档(或者如果bash
它是readline
库)以了解如何重新打印提示或如何配置其热键。