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.
- Il
clearcomando esamina terminfo/termcap ed emette sequenze di controllo appropriate.- Se la voce terminfo/termcap ha un
E3capacità, 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 ilclearcomando. - Quindi usa il
clearcapacità di cancellare lo schermo visibile.
- Se la voce terminfo/termcap ha un
- 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
puttyla voce definisceE3=E[3Jche è la sequenza di controllo dell'estensione di Xterm. - Il
pcvtxxdella console NetBSD entry è una delle tante che definisconoclear=E[HE[Jo qualcosa di simile. Si tratta di due normali sequenze di controllo ECMA-48.
- Lo
- 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 CSIJcancella dalla posizione corrente del cursore fino alla fine dello schermo. - CSI
2J(ED 2) cancella l'intero schermo. - CSI
3J(ED 3) cancella il buffer di scorrimento.
- CSI
Quando si tratta in particolare del terminale GNOME:
- Il tipo di terminale è correttamente
gnome, ma alcune persone lo lasciano erroneamente impostato suxterm. - Lo
gnomeLa voce terminfo non definisce unE3capacità e su molti sistemi, ancora! — nemmeno ilxtermvoce in quanto questo non è filtrato da Dickey terminfo. Quindiclearscrive semplicemente il contenuto delclearcapacità. - Il contenuto del
clearcapacità per quelle voci di terminfo sono le sequenze di controllo per posizionare il cursore seguite da cancellare l'intero schermo. - 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.
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.