Když použiji clear
příkaz k vymazání obrazovky. Není vymazán (viz snímek obrazovky, když po provedení příkazu trochu posunu nahoru)
Takže zdvojnásobím příkaz, abych dosáhl správného chování:
$ clear && clear && DD=0 ...
Proč musím zdvojnásobit příkaz, aby se obrazovka vyčistila?
UPD
Vlastně když jen clear
Mám vyčištěnou obrazovku. Můžu se ale posunout nahoru a vidět posledních 25 řádků (pokud je obrazovka 80×25). Když spustím clear;clear
Tyto řádky jsem vyčistil.
Přijatá odpověď:
Důležitá věc, kterou je třeba poznamenat, je značka u otázky. Toto chování je specifické pro GNOME Terminal a další emulátory terminálu, které jsou postaveny na libvte. Toto neuvidíte v Xterm, ani v Unicode RXVT, ani v emulátoru terminálu zabudovaném v jádře Linuxu ani na konzole FreeBSD.
Co se obecně děje, je toto.
clear
příkaz se podívá na terminfo/termcap a vydá příslušné řídicí sekvence.- Pokud má položka terminfo/termcap
E3
schopnost to, nejprve to napíše. Tím dojde k vymazání řídicích sekvencí pro vymazání vyrovnávací paměti scrollback. Toto a historie za tím jsou podrobně zdokumentovány v manuálové stránce Dickey ncurses proclear
příkaz. - Potom použije
clear
schopnost vymazat viditelnou obrazovku.
- Pokud má položka terminfo/termcap
- Řídicí sekvence v položce terminfo/termcap jsou určeny typem terminálu; ale s výjimkou (dnes vzácných) terminálů, které používají FormFeed k vymazání obrazovky (což DEC VT a jejich imitátory ne), jsou to buď obyčejné staré řídicí sekvence ECMA-48 nebo jejich rozšíření. Například:
putty
položka definujeE3=E[3J
což je řídicí sekvence rozšíření Xterm.pcvtxx
konzoly NetBSD položka je jednou z mnoha, které definujíclear=E[HE[J
nebo něco podobného. Toto jsou dvě běžné řídicí sekvence ECMA-48.
- Emulátor terminálu působí na řídicí sekvence. Jak je definováno ECMA-48 a jeho rozšířením Xterm:
- CSI
H
(CUP) vrátí kurzor. - CSI
J
(ED 0) nebo jen CSIJ
vymaže z aktuální pozice kurzoru na konec obrazovky. - CSI
2
J
(ED 2) vymaže celou obrazovku. - CSI
3
J
(ED 3) vymaže vyrovnávací paměť scrollback.
- CSI
Pokud jde konkrétně o terminál GNOME:
- Typ terminálu je správně
gnome
, ale někteří lidé ji nechávají chybně nastavenou naxterm
. gnome
položka terminfo nedefinujeE3
schopnosti a na mnoha systémech – stále! — anixterm
záznam, protože to neproniklo dolů z Dickey terminfo. Takžeclear
pouze vypíše obsahclear
schopnosti.- Obsah
clear
schopnostmi pro tyto položky terminfo jsou ovládací sekvence pro návrat kurzoru do původní polohy a následně vymazání celé obrazovky. - Terminál GNOME však neimplementuje vymazání celé obrazovky správně. Přesněji řečeno, knihovna, na které je založena, libvte, to nedělá v kódu své
VteTerminalPrivate::seq_clear_screen()
funkce. Spíše libvte posouvá obrazovku dolů o celou obrazovku v hodnotě prázdných řádků a přesune pozici kurzoru na první z těchto prázdných řádků.
To je důvod, proč vidíte, co vidíte. libvte nevymaže celou obrazovku, když je k tomu vyzván. Spíše dělá něco, co se tomu povrchně podobá, dokud člověk neudělá přesně to, co udělal tazatel zde:posuňte okno terminálu zpět a podívejte se na vyrovnávací paměť pro posun zpět. Pak je rozdíl do očí bijící.
Na jiných terminálových emulátorech, jako jsou Xterm a Unicode RXVT, řídicí sekvence ED 2 skutečně vymaže obrazovku, vymaže každou pozici na obrazovce shora dolů a nemění vyrovnávací paměť pro scrollback. Ale na emulátorech terminálu libvte to prostě posune aktuální obrazovku nahoru do vyrovnávací paměti pro rolování a přidá na obrazovku prázdné řádky. Obsah předchozí obrazovky se nevymaže, ale přesune se do vyrovnávací paměti pro rolování.
A pokud spustíte clear
dvakrát, přidá dva hodnota prázdných řádků na obrazovce. Pokud je vaše vyrovnávací paměť pro posun zpět dostatečně velká, můžete stále najděte původní obsah obrazovky, jednoduše výše v rolovací vyrovnávací paměti.
Další čtení
- Ovládací funkce pro kódované znakové sady . ECMA-48. 1976.
- Georgi Kirilov (2007-12-30). Ctrl-L přidá prázdné místo do vyrovnávací paměti scrollback . Chyba GNOME #506438.
- Do jaké míry jsou emulátory terminálu xterm, xterm-color a linux založeny na VT100?
- Vymazání „staré“ vyrovnávací paměti pro rolování
- Příkaz Bash clear podivné chování smaže vyrovnávací paměť pro rolování.
- https://superuser.com/questions/1094599/
- Thomas Dickey (2018). „Známé chyby v XTermu a podobných:Terminál GNOME“. Často kladené otázky XTerm . invisible-island.net.
- Thomas Dickey (2018). „Známé chyby v XTerm a podobných:Poznámky k VTE“. Často kladené otázky XTerm . invisible-island.net.