在 Bash 暫停其輸出之前列印一條消息
我目前正在編寫一些 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 行中發出的消息。