GNU/Linux >> Linux の 問題 >  >> Linux

なぜ「クリア」は画面全体をクリアしないのですか?

clearを使用する場合 画面をクリアするコマンド。クリアされません(コマンドの実行後に少し上にスクロールするとスクリーンショットが表示されます)

だから私は正しい振る舞いを得るためにコマンドを2倍にします:

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

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

UPD

実際、 clearだけなら 画面がクリアになりました。しかし、上にスクロールして最後の25行を表示できます(画面が80×25の場合)。 clear; clearを実行すると それらの行をクリアしました。

承認された回答:

ここで注意すべき重要なことは、質問のタグです。この動作は、GNOMEターミナルおよびlibvte上に構築されたその他のターミナルエミュレーターに固有です。これは、Xterm、Unicode RXVT、Linuxカーネルに組み込まれているターミナルエミュレータ、またはFreeBSDコンソールでは表示されません。

一般的に起こることはこれです。

  1. クリア コマンドはterminfo/termcapを調べ、適切な制御シーケンスを発行します。
    1. terminfo/termcapエントリにE3がある場合 機能それ、それは最初にそれを書きます。これにより、制御シーケンスが発行され、スクロールバックバッファがクリアされます。これとその背後にある歴史は、 clearのDickeyncursesのマニュアルページに詳細に記載されています。 コマンド。
    2. 次に、 clearを使用します 表示されている画面をクリアする機能。
  2. terminfo / termcapエントリの制御シーケンスは、端末タイプによって決定されます。ただし、FormFeedを使用して画面をクリアする(現在はまれな)端末(DEC VTとその模倣者は使用しません)を除いて、それらは単なる古いECMA-48制御シーケンスまたはその拡張のいずれかです。例:
    • パテ エントリはE3=E [3Jを定義します これはXterm拡張制御シーケンスです。
    • NetBSDコンソールのpcvtxx エントリは、 clear =E [HE [Jを定義する多くのエントリの1つです。 または同様のもの。これは2つの通常のECMA-48制御シーケンスです。
  3. ターミナルエミュレータは、制御シーケンスに基づいて動作します。 ECMA-48とそのXterm拡張で定義されているように:
    • CSI H (CUP)カーソルをホームにします。
    • CSI J (ED 0)または単にCSI J 現在のカーソル位置から画面の最後まで消去します。
    • CSI 2 J (ED 2)画面全体を消去します。
    • CSI 3 J (ED 3)スクロールバックバッファを消去します。

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

  1. 端末タイプは適切にgnome 、しかし、誤って xtermに設定したままにしておく人もいます 。
  2. gnome terminfoエントリはE3を定義していません 機能、そして多くのシステムで—それでも! — xtermも同様です これはDickeyterminfoから浸透していないためエントリ。したがって、 clear clearの内容を書き出すだけです 機能。
  3. clearの内容 これらのterminfoエントリの機能は、カーソルをホームに移動してから画面全体を消去する制御シーケンスです。
  4. ただし、GNOMEターミナルは画面全体の消去を正しく実装していません。 より具体的には、それが基づいているライブラリlibvteは、その VteTerminalPrivate ::seq_clear_screen()のコードではそれを行いません。 働き。むしろ、libvteは画面全体をスクロールして、画面全体に相当する空白行を表示し、カーソル位置をそれらの空白行の最初の行に移動します。
関連:荒野のシーンを描いたこのスクリーンキャプチャはどのゲームに属しますか?

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

XtermやUnicodeRXVTなどの他のターミナルエミュレータでは、ED 2制御シーケンスは実際に画面を消去し、画面上のすべての位置を上から下に消去し、スクロールバックバッファを変更しません。ただし、libvteターミナルエミュレータでは、現在の画面をスクロールバックバッファにプッシュし、画面に相当する空白行を追加するだけです。前の画面の内容は消去されませんが、スクロールバックバッファに移動されます。

そして、 clearを実行すると コマンドを2回実行すると、2つが追加されます 画面の空白行に相当します。スクロールバックバッファが十分に大きい場合は、まだ 元の画面の内容を見つけて、スクロールバックバッファのさらに上に移動します。

さらに読む

  • コード化された文字セットの制御機能 。 ECMA-48。 1976年。
  • George Kirilov(2007-12-30)。 Ctrl-Lはスクロールバックバッファに空白を追加します 。 GNOMEバグ#506438。
  • VT100に基づくxterm、xterm-color、およびlinuxターミナルエミュレーターはどの程度ですか?
  • 「古い」スクロールバックバッファをクリアする
  • Bashclearコマンドの奇妙な動作によりスクロールバックバッファが削除されます。
  • https://superuser.com/questions/1094599/
  • トーマスディッキー(2018)。 「XTermとLook-alikesの既知のバグ:GNOMEターミナル」。 XTermのよくある質問 。 invisible-island.net。
  • トーマスディッキー(2018)。 「XTermとLook-alikesの既知のバグ:VTEに関する注意」。 XTermのよくある質問 。 invisible-island.net。

Linux
  1. Ctrl-LがBashで画面をクリアしないのはなぜですか? Linuxでキーをバインドする方法は?

  2. su だけでなく su - を使用するのはなぜですか?

  3. bash履歴を削除するだけでは不十分なのはなぜですか?

  1. なぜCdはプログラムではないのですか?

  2. Findが「-execCp{}Dir +」を受け入れないのはなぜですか?

  3. コマンドが見つからないのになぜ長い遅延があるのですか?

  1. Linux –Setuidが機能しないのはなぜですか??

  2. 画面コマンドを使用したスリープコマンドがPsに表示されませんか?

  3. screen コマンドでスクロールバックをクリアするには?