在 Bash 暂停输出之前打印一条消息

在 Bash 暂停输出之前打印一条消息

我目前正在编写一些 Bash 脚本,并构建了一个返回日志信息的工具。但是,脚本有时会返回很多行(取决于网络上发生的情况),并且Ctrl+S通过“冻结”输出来帮助读取打印的行。我读到,XOFF按下该组合键时,Bash 会暂停流量控制 ( ),直到按下Ctrl+为止。Q

有没有一种方法可以让我在 Bash 暂停之前按Ctrl+时打印一条消息?S

例如,当用户按下Ctrl+时,在 Bash 暂停输出之前会出现S类似(或其他)的消息?Stopped - press Ctrl+Q to proceed

答案1

这种行为与 bash (或任何与此相关的 shell)无关。当终端设备驱动程序从终端接收到^S字符(或由 设定的任何内容)时,它会暂停输出(停止向终端发送数据) 。stty stop

在该终端中由 shell 启动的应用程序不会看到该^S字符,即使它们从终端设备读取也是如此。

shell 只是在终端中运行的另一个应用程序,其工作只是解释命令行并在单独的进程中启动相应的命令。当命令运行时,shell 不执行任何操作,它只是等待命令完成,以便提示您输入另一个命令。

实际上,现代 shell 包括bash在以下情况下禁用该流量控制进程:他们(他们的命令行编辑器)与终端设备交互。您会注意到,当您按下Ctrl+Sbash 提示符并假设它处于emacs模式时,bash会将其作为增量搜索小部件调用进行处理。

当您按下时会在此处发出一条消息Ctrl+S,您需要修改的是终端设备驱动程序(线路规则)。虽然在回复终端发送的内容时发送一些东西感觉有点傻“请停止发送”

另一种方法可能是将 shell 会话包装到一些伪终端包装器中,该包装器将主机终端设备放入生的模式并提供自己的伪终端设备bash,截取这些^S字符来写入消息。

这可以通过 GNU screen 来完成,例如,它是终端内的终端模拟器。

添加到您的~/.screenrc

bindkey "\023" eval 'hstatus "Stopped - press Ctrl+Q to proceed"' xoff
bindkey "\021" eval "hstatus screen" xon

这里是您终端的硬状态行中发出的消息。

相关内容