top update のようなコマンドは、コンソールに追加せずに出力をどのように更新するのでしょうか?

top update のようなコマンドは、コンソールに追加せずに出力をどのように更新するのでしょうか?

PuTTY ターミナル エミュレーター経由で SSH を使用してリモート Linux サーバーに接続します。実行したコマンドとコンソールの出力がターミナル ウィンドウに追加され続けていることに気付きました。つまり、スクロールバーを使用して上下にスクロールすると、印刷された紙のように、以前に実行したコマンドとその出力を見ることができます。ただし、一部のコマンドは、topコンソールに追加されずに出力を継続的に更新します。これはどのように機能するのでしょうか。

答え1

ここでは、潜在的に 2 つのメカニズムが機能していると考えられます。

1 つは、Martin Prikryl が回答で言及しているように、ANSI エスケープ コード (場合によっては他の非 ANSI コード) を使用して、テキストベースの疑似グラフィカル インターフェイスを実装することです。このための最低限必要なのは、^[[2J画面上のすべての内容を消去する と、^[[;Hカーソルを画面の左上に移動する という 2 つの特定の ANSI エスケープ コードです。これらを組み合わせることで、スクロールバック バッファーに追加することなく、各「フレーム」の内容を 1 つずつ書き出すことができます。ほとんどのアプリケーションでは、実際にはこれら以外にも多くのコードを使用しています (たとえば、カーソルを任意の方向に移動するためのコード セットがあり、これらを使用して画面の「空」であるべき部分をスキップするのはごく普通です)。実際には、ほとんどの (ただしすべてではありません) 大規模なアプリケーションでは、libcurses (またはより一般的には ncurses) または直接同等のものを使用して、これらすべてを処理しています。

もう 1 つの可能性は、通常は ANSI エスケープ コードと組み合わせて画面の内容を操作するもので、もともと xterm によって提供されていたが、現在ではほとんどの適切なターミナル エミュレーターによって広く実装されている、代替画面バッファーと呼ばれる特別な機能です。これと通常のスクロールバック バッファーを切り替えるために使用されるエスケープ コードのペア (^[[?1049h^[[1049l) があります。テキスト UI を表示する前に代替画面バッファーに切り替えることで、プログラムはスクロールバック バッファーの変更をまったく回避できます。これにより、通常はスクロールするキーストロークを傍受せずにスクロールできなくなるだけでなく、プログラムを実行する前の既存のターミナルの内容を検査するなどの操作もプログラムで実行できるようになります (また、フルスクリーン アプリケーションを開く前に何をしていたかを確認しやすくなります)。

答え2

あなたが観察するものは歴史的発展の産物です。

初期のインタラクティブ端末はまさに神に忠実だったテレタイプライター; 本質的には電話回線に接続された電気タイプライターです。(/dev/ がなぜ端末名前の通りの名前が付けられているのでしょうか?) テキスト コマンド (基本的な、扱いにくい行編集も含めて) を入力すると、テキスト出力が得られます。

もちろん、それらは左から右、上から下への移動しかできませんでした。ああ、待ってください、そうではありません!Ctrl-Hで文字を1つ戻し、もう一度入力して太字にすることができます。見てください、それが一部のプログラムはまだプリンタ用にテキストをフォーマットするコードです。テレタイプライターには、改行、フォーム フィード、ベルなどの基本的な制御コードもいくつかありました。

CRT ベースの端末への移行は、たとえ木々を節約するためであったとしても、論理的でした。しかし、それ以来、すべての端末 (エミュレーター) はテレタイプライターの基本的な機能を提供してきました。特に指示されない限り (有名なエスケープ シーケンスを使用)、受信した 7 ビット ASCII コード (基本制御コードを含む) は、対応する文字またはコマンドとして解釈され、端末によって維持される現在のカーソル位置から、左から右、上から下に表示されます。

しかし、より高性能な端末は実際に画面上の任意の行/列の位置に文字を表示できるため、制御コード シーケンスを通じてプログラム的にそれを実行する手段が備わっており、オペレーティング システムは適切なシーケンスを使用するように何らかの方法で構成されていました。一部のプログラム、特にエディター、シェル、その他の対話型のユーザー指向プログラム (top など) は、この機能を使用して画面全体を制御します。

この「ビジュアル モード」があまり一般的でない理由は、「装飾」なしで文字の線形シーケンスを単純に出力することが非常に多用途であり、同時に幅広い出力に十分であるためです。つまり、空白 (スペース、タブ、改行) を含む文字の連続シーケンスである表形式のデータを印刷できます。パイプとデバイスを備えた Unix/Linux エコシステム全体は、このパラダイムに基づいて構築されています。これにより、find、grep、cut などの「ビルディング ブリック」をプラグインして、テキスト情報を自動的に処理できます。出力に位置合わせおよび書式設定コマンドが混在している場合は、これはまったく不可能です。

答え3

ほとんどのコマンドは単に端末に行を印刷するだけです。端末クライアントは、古いラインプリンタと同じように行を印刷します。スクロールバックは、無限の紙プリンターから出てきます。

しかし、ターミナルクライアント(別名端末エミュレータ) は、カーソルを画面上で移動したり、サーバー (リモート アプリケーション) が「端末画面」の任意の場所に印刷したりできるなど、さらに多くの機能を備えています。 、topviMidnight Commander などのアプリケーションでは、これを使用してフル スクリーンの「GUI」インターフェイス (実際にはTUIインターフェースこれらの高度な機能は、ANSIエスケープコード

関連情報