GNU/Linux >> Belajar Linux >  >> Linux

Mengapa `clear` Jangan Hapus Seluruh Layar?

Saat saya menggunakan clear perintah untuk menghapus layar. Itu tidak dihapus (lihat tangkapan layar ketika saya menggulir sedikit ke atas setelah perintah selesai)

Jadi saya menggandakan perintah untuk mendapatkan perilaku yang benar:

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

Mengapa saya perlu menggandakan perintah untuk membersihkan layar?

UPD

Sebenarnya kalau saya clear Saya mendapat layar yang dibersihkan. Tetapi saya dapat menggulir ke atas dan melihat 25 baris terakhir (jika layarnya 80 × 25). Ketika saya menjalankan clear;clear Saya sudah menghapus garis itu.

Jawaban yang Diterima:

Hal penting yang perlu diperhatikan di sini adalah tag pada pertanyaan. Perilaku ini khusus untuk Terminal GNOME dan emulator terminal lainnya yang dibangun di atas libvte. Anda tidak akan melihat ini di Xterm, atau di Unicode RXVT, atau di emulator terminal yang ada di dalam kernel Linux, atau di konsol FreeBSD.

Apa yang terjadi secara umum adalah ini.

  1. Yang clear perintah melihat terminfo/termcap dan mengeluarkan urutan kontrol yang sesuai.
    1. Jika entri terminfo/termcap memiliki E3 kemampuan itu, pertama-tama menulis itu. Ini mengeluarkan urutan kontrol untuk menghapus buffer scrollback. Ini dan sejarah di baliknya didokumentasikan secara rinci di halaman manual Dickey ncurses untuk clear perintah.
    2. Kemudian menggunakan clear kemampuan untuk menghapus layar yang terlihat.
  2. Urutan kontrol dalam entri terminfo/termcap ditentukan oleh tipe terminal; tetapi, dengan pengecualian terminal (saat ini jarang terjadi) yang menggunakan FormFeed untuk membersihkan layar (yang tidak dilakukan oleh DEC VT dan penirunya), terminal tersebut hanyalah rangkaian kontrol ECMA-48 lama atau ekstensinya. Misalnya:
    • putty entri mendefinisikan E3=E[3J yang merupakan urutan kontrol ekstensi Xterm.
    • pcvtxx konsol NetBSD entri adalah salah satu dari banyak yang mendefinisikan clear=E[HE[J .] atau sesuatu yang serupa. Ini adalah dua rangkaian kontrol ECMA-48 biasa.
  3. Emulator terminal bertindak berdasarkan urutan kontrol. Seperti yang didefinisikan oleh ECMA-48 dan ekstensi Xterm untuknya:
    • CSI H (CUP) menampung kursor.
    • CSI J (ED 0) atau cukup CSI J menghapus dari posisi kursor saat ini ke akhir layar.
    • CSI 2 J (ED 2) menghapus seluruh layar.
    • CSI 3 J (ED 3) menghapus buffer scrollback.

Khususnya mengenai Terminal GNOME:

  1. Tipe terminal adalah gnome , tetapi beberapa orang membiarkannya secara keliru disetel ke xterm .
  2. Si gnome entri terminfo tidak mendefinisikan E3 kemampuan, dan pada banyak sistem — masih! — begitu juga dengan xterm entri karena ini belum meresap dari Dickey terminfo. Jadi clear hanya menulis isi clear kemampuan.
  3. Isi dari clear Kemampuan untuk entri terminfo tersebut adalah urutan kontrol ke home kursor diikuti dengan menghapus seluruh layar.
  4. Tetapi Terminal GNOME tidak menerapkan penghapusan seluruh layar dengan benar. Lebih khusus lagi, perpustakaan yang menjadi dasarnya, libvte, tidak melakukannya dalam kode VteTerminalPrivate::seq_clear_screen()-nya fungsi. Sebaliknya, libvte menggulir layar ke bawah sepanjang garis kosong di seluruh layar, dan memindahkan posisi kursor ke baris pertama dari baris kosong tersebut.
Terkait:Game mana yang tangkapan layarnya menggambarkan pemandangan hutan belantara?

Inilah mengapa Anda melihat apa yang Anda lihat. libvte tidak menghapus seluruh layar saat disuruh. Melainkan melakukan sesuatu yang memiliki kemiripan yang dangkal dengan itu, sampai seseorang melakukan persis seperti yang dilakukan penanya di sini:gulir kembali jendela terminal untuk melihat buffer gulir kembali. Maka perbedaannya sangat mencolok.

Pada emulator terminal lain seperti Xterm dan Unicode RXVT, urutan kontrol ED 2 benar-benar menghapus layar, menghapus setiap posisi di layar pada tempatnya, dari atas ke bawah, dan tidak mengubah buffer scrollback. Tetapi pada emulator terminal libvte, itu hanya mendorong layar saat ini ke buffer scrollback dan menambahkan baris kosong senilai layar. Konten layar sebelumnya tidak dihapus tetapi digeser ke buffer scrollback.

Dan jika Anda menjalankan clear perintah dua kali, ia menambahkan dua garis kosong senilai layar. Jika buffer scroll back Anda cukup besar, Anda dapat tetap temukan konten layar asli, cukup lebih jauh di buffer scrollback.

Bacaan lebih lanjut

  • Fungsi Kontrol untuk Kumpulan Karakter Berkode . ECMA-48. 1976.
  • Georgi Kirilov (2007-12-30). Ctrl-L menambahkan ruang kosong ke buffer scrollback . Bug GNOME #506438.
  • Sejauh mana emulator terminal xterm, xterm-color, dan linux berbasis VT100?
  • Menghapus buffer scrollback "lama"
  • Bash clear command perilaku aneh menghapus buffer scrollback.
  • https://superuser.com/questions/1094599/
  • Thomas Dickey (2018). “Bug yang Dikenal di XTerm dan Serupa:Terminal GNOME“. Pertanyaan Umum XTerm . tak terlihat-island.net.
  • Thomas Dickey (2018). “Bug yang Dikenal di XTerm dan Serupa:Catatan di VTE“. Pertanyaan Umum XTerm . tak terlihat-island.net.

Linux
  1. Bagaimana cara menghapus scrollback di perintah layar?

  2. Mengapa saya tidak melihat MSG_EOR untuk SOCK_SEQPACKET di linux?

  3. cara membuat lebih sedikit pager merespons roda gulir dan tidak menghapus layar

  1. Mengapa Ctrl-L Tidak Membersihkan Layar di Bash? Bagaimana Cara Mengikat Kunci di Linux?

  2. Mengapa Cd Bukan Program?

  3. Mengapa kita menggunakan su - dan bukan hanya su?

  1. Linux – Mengapa Kami Menggunakan Su – Dan Bukan Hanya Su?

  2. Mengapa Nullglob Tidak Default?

  3. Linux – Mengapa Setuid Tidak Bekerja??