私は現在、いくつかのBashスクリプトを書いてログ情報を返すツールを構築しています。ただし、スクリプトは時々ネットワーク上で発生する状況に応じて多くの行を返し、Ctrl+はS印刷された行を読み取ることができるように出力を「固定」するのに役立ちます。XOFF
このキーの組み合わせを押すと、BashはCtrl+を押すまでフロー制御()を一時停止すると読みました。Q
CtrlBashが一時停止する前に+を押すとメッセージを印刷する方法はありますか?S
たとえば、ユーザーが+を押すと、CtrlBashが出力を一時停止する前にS同様の(または他の)メッセージが表示されますか?Stopped - press Ctrl+Q to proceed
答え1
この動作はbash(またはその問題に対するシェル)とは関係ありません。端末デバイスドライバが^S
端末から文字(または設定された内容)を受信すると、出力を一時停止します(データを端末に送信するのを停止します)。stty stop
その端末のシェルで起動されたアプリケーションは、^S
端末デバイスから読み取ってもこの文字を表示できません。
シェルは端末で実行される別のアプリケーションにすぎず、そのタスクはコマンドラインを解釈し、別々のプロセスでそのコマンドを実行することです。コマンドの実行中に、シェルは何も実行せずにコマンドが完了し、他のコマンドの入力を求めるのを待ちます。
実際、最新のシェルには、bash
次の状況でこのフロー制御プロセスを無効にする機能が含まれています。それら(コマンドラインエディタ)を使用して端末デバイスと対話します。 bashプロンプトを押してモードCtrl+Sにあると仮定すると、増分検索ウィジェット呼び出しとして処理されることがわかります。emacs
bash
Ctrl+S変更が必要なのが端末デバイスドライバ(ライン規約)であることをクリックすると、ここにメッセージが表示されます。端末から送信したことに対する返信を送信するのは少し愚かな気がしますが、「送らないで」。
別のアプローチは、シェルセッションを、ホスト端末装置を次の位置に配置する擬似端末ラッパーでラップすることである。生のbash
モードを使用してこれらの^S
文字を傍受してメッセージを作成する独自の疑似端末装置を提供します。
たとえば、端末内の端末エミュレータであるGNU画面を介してこれを行うことができます。
以下に追加します~/.screenrc
。
bindkey "\023" eval 'hstatus "Stopped - press Ctrl+Q to proceed"' xoff
bindkey "\021" eval "hstatus screen" xon
以下は、端末のハードステータス行に表示されるメッセージです。