
答え1
ここで注目すべき重要な点は、質問のタグです。この動作は、GNOME ターミナルおよび libvte 上に構築されたその他のターミナル エミュレータに固有のものです。Xterm、Unicode RXVT、Linux カーネルに組み込まれたターミナル エミュレータ、FreeBSD コンソールでは、この現象は発生しません。
一般的にはこうなります。
- この
clear
コマンドは terminfo/termcap を調べて適切な制御シーケンスを発行します。- terminfo/termcap エントリに
E3
機能がある場合、まずそれを書き出します。これにより、スクロールバック バッファをクリアするための制御シーケンスが発行されます。この詳細と、その背景にある歴史については、Dickey ncursesのマニュアルclear
ページ。 - 次に、
clear
表示されている画面をクリアする機能を使用します。
- terminfo/termcap エントリに
- terminfo/termcap エントリ内の制御シーケンスは端末の種類によって決まりますが、FormFeed を使用して画面をクリアする (DEC VT とその模倣機は使用しません) (最近ではまれですが) 端末を除けば、それらは単なる古い ECMA-48 制御シーケンスか、その拡張です。例:
- エントリー
putty
E3=\E[3J
Xterm 拡張制御シーケンスを定義します。 - NetBSDコンソールの
pcvtxx
エントリまたは類似のものを定義する多くのものの 1 つですclear=\E[H\E[J
。これは 2 つの通常の ECMA-48 制御シーケンスです。
- エントリー
- ターミナル エミュレータは制御シーケンスに基づいて動作します。ECMA-48 およびその Xterm 拡張で定義されているとおりです。
- CSI
H
(CUP) はカーソルをホーム位置に戻します。 - CSI
0
J
(ED 0) または単に CSI は、J
現在のカーソル位置から画面の最後までを消去します。 - CSI
2
J
(ED2)は画面全体を消去します。 - CSI
3
J
(ED 3) はスクロールバック バッファを消去します。
- CSI
特に GNOME ターミナルに関しては:
- 端末タイプは適切に です
gnome
が、誤って に設定したままにしている人もいますxterm
。 - terminfo
gnome
エントリ能力を定義していないしE3
、多くのシステムでは、エントリもxterm
定義していない。ディッキー用語情報.機能clear
の内容を書き出すだけですclear
。 - これらの terminfo エントリの機能の内容は、
clear
カーソルをホーム位置に戻し、その後に画面全体を消去する制御シーケンスです。 - しかし、GNOME ターミナルでは画面全体の消去が正しく実装されていません。 より具体的には、それが基づいているライブラリlibvteは、コード内でそれを行わない。その
VteTerminalPrivate::seq_clear_screen()
機能代わりに、libvte は画面全体を空白行分スクロールし、カーソルの位置をそれらの空白行の最初の行に移動します。
これが、あなたが見ているものを見る理由です。libvte は、指示されたときに画面全体を消去しません。むしろ、質問者がここで行ったのとまったく同じこと、つまりターミナル ウィンドウをスクロールしてスクロール バック バッファーを確認するまで、表面上はそれに似た動作をします。すると、違いは明白になります。
Xterm や Unicode RXVT などの他の端末エミュレータでは、ED 2 制御シーケンスは実際に画面を消去し、画面上のすべての位置を上から下にその場で消去し、スクロールバック バッファは変更しません。ただし、libvte 端末エミュレータでは、現在の画面をスクロールバック バッファに押し上げ、画面分の空白行を追加するだけです。前の画面の内容は消去されず、スクロールバック バッファにシフトされます。
コマンドを2回実行するとclear
、二画面の空白行数分のスクロールバックバッファが十分大きければ、まだ元の画面の内容を見つけるには、スクロールバック バッファーの上に移動します。
参考文献
- コード化文字セットの制御関数. ECMA-48. 1976年。
- ゲオルギ・キリロフ(2007年12月30日)。Ctrl-L はスクロールバックバッファに空白を追加しますGNOME バグ #506438。
- xterm、xterm-color、Linux 端末エミュレーターはどの程度 VT100 に基づいていますか?
- 「古い」スクロールバックバッファをクリアする
- Bash の clear コマンドの奇妙な動作により、スクロールバック バッファが削除されます。
- https://superuser.com/questions/1094599/
- トーマス・ディッキー(2018年)。XTerm および類似品の既知のバグ: GNOME ターミナル「」。 XTerm よくある質問。見えない島.net。
- トーマス・ディッキー(2018年)。XTerm および類似品の既知のバグ: VTE に関する注意事項「」。 XTerm よくある質問。見えない島.net。
答え2
端末をクリアして出力バッファ全体を破棄したい場合は、 を実行することをお勧めしますtput reset
。これにより、たとえば以前のプログラムがクラッシュして端末がクリーンでない状態になった場合に、端末が確実にクリアされ、ボーナスとして状態が修正されます。さらに、 はtput
正しい端末タイプを判別できるほど賢いので、端末が VT100 を使用しているか、他のコマンド シーケンスを使用しているかを知る必要はありません。
POSIX で定義されているようにtput reset
、POSIX 互換システムでも動作するはずです。tput は、以下の例のように、さまざまな方法で使用できます。