我目前正在编写一些 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
这里是您终端的硬状态行中发出的消息。