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
clear
comando esamina terminfo/termcap ed emette sequenze di controllo appropriate.- 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 ilclear
comando. - Quindi usa il
clear
capacità 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
putty
la voce definisceE3=E[3J
che è la sequenza di controllo dell'estensione di Xterm. - Il
pcvtxx
della console NetBSD entry è una delle tante che definisconoclear=E[HE[J
o 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 CSIJ
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.
- CSI
Quando si tratta in particolare del terminale GNOME:
- Il tipo di terminale è correttamente
gnome
, ma alcune persone lo lasciano erroneamente impostato suxterm
. - Lo
gnome
La voce terminfo non definisce unE3
capacità e su molti sistemi, ancora! — nemmeno ilxterm
voce in quanto questo non è filtrato da Dickey terminfo. Quindiclear
scrive semplicemente il contenuto delclear
capacità. - 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. - 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.