GNU/Linux >> Linux Esercitazione >  >> Linux

Perché "cancella" non cancella l'intero schermo?

Quando uso clear comando per cancellare lo schermo. Non è cancellato (vedi screenshot quando scorro un po' verso l'alto dopo aver eseguito il comando)

Quindi raddoppio il comando per ottenere il comportamento corretto:

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

Perché devo raddoppiare il comando per cancellare lo schermo?

UPD

In realtà se solo clear Ho cancellato lo schermo. Ma posso scorrere verso l'alto e vedere le ultime 25 righe (se lo schermo è 80 × 25). Quando eseguo clear;clear Ho cancellato quelle righe.

Risposta accettata:

La cosa importante da notare qui è il tag sulla domanda. Questo comportamento è specifico di GNOME Terminal e di qualsiasi altro emulatore di terminale basato su libvte. Non lo vedrai in Xterm, o in Unicode RXVT, o nell'emulatore di terminale integrato nel kernel Linux, o sulla console di FreeBSD.

Quello che succede in generale è questo.

  1. Il clear comando esamina terminfo/termcap ed emette sequenze di controllo appropriate.
    1. Se la voce terminfo/termcap ha un E3 capacità, lo scrive prima. Questo emette sequenze di controllo per cancellare il buffer di scorrimento. Questo e la sua storia sono documentati in dettaglio nella pagina di manuale di Dickey ncurses per il clear comando.
    2. Quindi usa il clear capacità di cancellare lo schermo visibile.
  2. Le sequenze di controllo nella voce terminfo/termcap sono determinate dal tipo di terminale; ma, con l'eccezione dei terminali (oggi rari) che usano FormFeed per ripulire lo schermo (cosa che non fanno i DEC VT e i loro imitatori), sono o semplici vecchie sequenze di controllo ECMA-48 o estensioni ad esse. Ad esempio:
    • Lo putty la voce definisce E3=E[3J che è la sequenza di controllo dell'estensione di Xterm.
    • Il pcvtxx della console NetBSD entry è una delle tante che definiscono clear=E[HE[J o qualcosa di simile. Si tratta di due normali sequenze di controllo ECMA-48.
  3. L'emulatore di terminale agisce sulle sequenze di controllo. Come definito da ECMA-48 e dalla sua estensione Xterm:
    • CSI H (CUP) posiziona il cursore.
    • CSI J (ED 0) o solo CSI J cancella dalla posizione corrente del cursore fino alla fine dello schermo.
    • CSI 2 J (ED 2) cancella l'intero schermo.
    • CSI 3 J (ED 3) cancella il buffer di scorrimento.

Quando si tratta in particolare del terminale GNOME:

  1. Il tipo di terminale è correttamente gnome , ma alcune persone lo lasciano erroneamente impostato su xterm .
  2. Lo gnome La voce terminfo non definisce un E3 capacità e su molti sistemi, ancora! — nemmeno il xterm voce in quanto questo non è filtrato da Dickey terminfo. Quindi clear scrive semplicemente il contenuto del clear capacità.
  3. Il contenuto del clear capacità per quelle voci di terminfo sono le sequenze di controllo per posizionare il cursore seguite da cancellare l'intero schermo.
  4. Ma il terminale GNOME non implementa correttamente la cancellazione dell'intero schermo. Più specificamente, la libreria su cui si basa, libvte, non lo fa nel codice del suo VteTerminalPrivate::seq_clear_screen() funzione. Piuttosto, libvte scorre lo schermo lungo un intero schermo di righe vuote e sposta la posizione del cursore sulla prima di quelle righe vuote.
Relazionato:A quale gioco appartiene questa cattura dello schermo raffigurante una scena selvaggia?

Questo è il motivo per cui vedi quello che vedi. libvte non sta cancellando l'intero schermo quando richiesto. Piuttosto sta facendo qualcosa che ha una somiglianza superficiale con quello, finché non si fa esattamente ciò che l'interrogante ha fatto qui:scorrere indietro la finestra del terminale per guardare il buffer di scorrimento indietro. Allora la differenza è evidente.

Su altri emulatori di terminale come Xterm e Unicode RXVT, la sequenza di controllo ED 2 cancella davvero lo schermo, cancellando ogni posizione sullo schermo in posizione, dall'alto verso il basso, e non alterando il buffer di scorrimento. Ma sugli emulatori di terminale libvte, spinge semplicemente lo schermo corrente nel buffer di scorrimento e aggiunge righe vuote per uno schermo. I contenuti della schermata precedente non vengono cancellati ma spostati nel buffer di scorrimento.

E se esegui clear comando due volte, ne aggiunge due valore dello schermo di righe vuote. Se il tuo buffer di scorrimento indietro è abbastanza grande, puoi ancora trova il contenuto dello schermo originale, semplicemente più in alto nel buffer di scorrimento.

Ulteriori letture

  • Funzioni di controllo per set di caratteri codificati . ECMA-48. 1976.
  • Georgi Kirilov (30-12-2007). Ctrl-L aggiunge uno spazio vuoto al buffer di scorrimento . Bug di GNOME #506438.
  • In che misura gli emulatori di terminale xterm, xterm-color e linux sono basati su VT100?
  • Cancellazione del "vecchio" buffer di scorrimento
  • Il comportamento strano del comando di cancellazione di Bash elimina il buffer di scorrimento.
  • https://superuser.com/questions/1094599/
  • Thomas Dickey (2018). "Bug noti in XTerm e simili:Terminale GNOME". Domande frequenti su XTerm . invisible-island.net.
  • Thomas Dickey (2018). "Bug noti in XTerm e simili:note su VTE". Domande frequenti su XTerm . invisible-island.net.

Linux
  1. Come cancellare lo scrollback nel comando dello schermo?

  2. Perché non vedo MSG_EOR per SOCK_SEQPACKET su Linux?

  3. Cancella uno schermo terminale per davvero

  4. perché sftp rmdir non funziona?

  5. come fare in modo che meno cercapersone risponda alla rotella di scorrimento e non cancellare lo schermo

Perché Cd non è un programma?

Linux – Perché usiamo Su – e non solo Su?

Perché Nullglob non è predefinito?

Linux – Perché Setuid non funziona??

Perché è Rm -rf e non Rmdir -rf?

Come cancellare il terminale in Linux {Cancella schermo in Linux}