参考文献

参考文献

clear画面をクリアするコマンドを使用すると、画面はクリアされません (コマンドの完了後に少し上にスクロールしたときのスクリーンショットを参照)

ここに画像の説明を入力してください

したがって、正しい動作を得るためにコマンドを 2 倍にします。

$ clear && clear && DD=0 ...

ここに画像の説明を入力してください

画面をクリアするにはなぜコマンドを 2 倍にする必要があるのですか?

上院

実際、clear画面がクリアされました。ただし、上にスクロールして最後の 25 行を見ることができます (画面が 80x25 の場合)。実行すると、clear;clearそれらの行がクリアされました。

答え1

ここで注目すべき重要な点は、質問のタグです。この動作は、GNOME ターミナルおよび libvte 上に構築されたその他のターミナル エミュレータに固有のものです。Xterm、Unicode RXVT、Linux カーネルに組み込まれたターミナル エミュレータ、FreeBSD コンソールでは、この現象は発生しません。

一般的にはこうなります。

  1. このclearコマンドは terminfo/termcap を調べて適切な制御シーケンスを発行します。
    1. terminfo/termcap エントリにE3機能がある場合、まずそれを書き出します。これにより、スクロールバック バッファをクリアするための制御シーケンスが発行されます。この詳細と、その背景にある歴史については、Dickey ncursesのマニュアルclearページ
    2. 次に、clear表示されている画面をクリアする機能を使用します。
  2. terminfo/termcap エントリ内の制御シーケンスは端末の種類によって決まりますが、FormFeed を使用して画面をクリアする (DEC VT とその模倣機は使用しません) (最近ではまれですが) 端末を除けば、それらは単なる古い ECMA-48 制御シーケンスか、その拡張です。例:
  3. ターミナル エミュレータは制御シーケンスに基づいて動作します。ECMA-48 およびその Xterm 拡張で定義されているとおりです。
    • CSI H(CUP) はカーソルをホーム位置に戻します。
    • CSI 0 J(ED 0) または単に CSI は、J現在のカーソル位置から画面の最後までを消去します。
    • CSI 2 J(ED2)は画面全体を消去します。
    • CSI 3 J(ED 3) はスクロールバック バッファを消去します。

特に GNOME ターミナルに関しては:

  1. 端末タイプは適切に ですgnomeが、誤って に設定したままにしている人もいますxterm
  2. terminfognomeエントリ能力を定義していないしE3、多くのシステムでは、エントリもxterm定義していない。ディッキー用語情報.機能clearの内容を書き出すだけですclear
  3. これらの terminfo エントリの機能の内容は、clearカーソルをホーム位置に戻し、その後に画面全体を消去する制御シーケンスです。
  4. しかし、GNOME ターミナルでは画面全体の消去が正しく実装されていません。 より具体的には、それが基づいているライブラリlibvteは、コード内でそれを行わない。そのVteTerminalPrivate::seq_clear_screen()機能代わりに、libvte は画面全体を空白行分スクロールし、カーソルの位置をそれらの空白行の最初の行に移動します。

これが、あなたが見ているものを見る理由です。libvte は、指示されたときに画面全体を消去しません。むしろ、質問者がここで行ったのとまったく同じこと、つまりターミナル ウィンドウをスクロールしてスクロール バック バッファーを確認するまで、表面上はそれに似た動作をします。すると、違いは明白になります。

Xterm や Unicode RXVT などの他の端末エミュレータでは、ED 2 制御シーケンスは実際に画面を消去し、画面上のすべての位置を上から下にその場で消去し、スクロールバック バッファは変更しません。ただし、libvte 端末エミュレータでは、現在の画面をスクロールバック バッファに押し上げ、画面分の空白行を追加するだけです。前の画面の内容は消去されず、スクロールバック バッファにシフトされます。

コマンドを2回実行するとclear画面の空白行数分のスクロールバックバッファが十分大きければ、まだ元の画面の内容を見つけるには、スクロールバック バッファーの上に移動します。

参考文献

答え2

端末をクリアして出力バッファ全体を破棄したい場合は、 を実行することをお勧めしますtput reset。これにより、たとえば以前のプログラムがクラッシュして端末がクリーンでない状態になった場合に、端末が確実にクリアされ、ボーナスとして状態が修正されます。さらに、 はtput正しい端末タイプを判別できるほど賢いので、端末が VT100 を使用しているか、他のコマンド シーケンスを使用しているかを知る必要はありません。

POSIX で定義されているようにtput reset、POSIX 互換システムでも動作するはずです。tput は、以下の例のように、さまざまな方法で使用できます。

関連情報