GNU/Linux >> Znalost Linux >  >> Linux

Proč „vymazat“ nevymazat celou obrazovku?

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.

  1. clear příkaz se podívá na terminfo/termcap a vydá příslušné řídicí sekvence.
    1. 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 pro clear příkaz.
    2. Potom použije clear schopnost vymazat viditelnou obrazovku.
  2. Ří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 definuje E3=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.
  3. 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 CSI J 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.

Pokud jde konkrétně o terminál GNOME:

  1. Typ terminálu je správně gnome , ale někteří lidé ji nechávají chybně nastavenou na xterm .
  2. gnome položka terminfo nedefinuje E3 schopnosti a na mnoha systémech – stále! — ani xterm záznam, protože to neproniklo dolů z Dickey terminfo. Takže clear pouze vypíše obsah clear schopnosti.
  3. 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.
  4. 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ů.
Související:Ke které hře patří tento snímek obrazovky zobrazující scénu v divočině?

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.

Linux
  1. Proč Ctrl-L nevyčistí obrazovku v Bash? Jak svázat klíče v Linuxu?

  2. Jak vymazat scrollback v příkazu na obrazovce?

  3. Proč nevidím MSG_EOR pro SOCK_SEQPACKET na linuxu?

  1. Proč není CD program?

  2. Linux – proč používáme Su – a nejen Su?

  3. proč nefunguje sftp rmdir?

  1. Proč není Nullglob výchozí?

  2. Proč Find nepřijímá ‚-exec Cp {} Dir +‘?

  3. Proč dlouhé zpoždění poté, co příkaz nebyl nalezen?