Bash

在 Bash 暫停其輸出之前列印一條消息

  • October 6, 2020

我目前正在編寫一些 Bash 腳本並建構了一個返回日誌資訊的工具。但是,腳本有時會返回很多行(取決於網路上發生的情況),並且Ctrl+S通過“凍結”輸出來幫助讀取列印的行。我讀到XOFF當按下該組合鍵直到按下Ctrl+時,Bash 會暫停流控制 ( ) Q

有沒有一種方法可以在暫停之前在 Bash 中按Ctrl+時列印一條消息?S

例如,當使用者按下Ctrl+時,在 Bash 暫停輸出之前會出現S類似(或其他)的消息?Stopped - press Ctrl+Q to proceed

這種行為與 bash (或任何與此相關的 shell)無關。^S終端設備驅動程序在從終端接收到字元(或由 設置的任何內容)時暫停輸出(停止向終端發送數據stty stop)。

^S即使從終端設備讀取,由您的 shell 在該終端中啟動的應用程序也不會看到該字元。

shell 只是在終端中執行的另一個應用程序,其工作只是解釋命令行並在單獨的程序中啟動相應的命令。當命令執行時,shell 什麼都不做,它只是等待它們完成,以便提示您輸入另一個命令。

實際上,現代 shell 包括在它們(它們的命令行編輯器)與終端設備互動bash時禁用該流控製過程。您會注意到,當您在 bash 提示符下按下並假設它處於模式時,將其作為增量搜尋小元件呼叫處理。Ctrl+S``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

這裡是在終端的 hardstatus 行中發出的消息。

引用自:https://unix.stackexchange.com/questions/613104