Naprawdę wyczyść ekran terminala

382

Użycie clearpolecenia na terminalu tylko oszuka użytkownika, że ​​ekran został wyczyszczony ... podczas przewijania za pomocą myszy nadal widać wynik poprzednich poleceń. To utrudnia życie, gdy toniesz w tsunami tekstu.

Różne rozwiązania (kod ucieczki itp.), Które można znaleźć w Internecie, są tylko odmianami tego, co już robi polecenie clear.

Jak więc naprawdę wyczyścić zawartość terminala w systemie Linux?

Samouk
źródło
44
Sklasyfikowałbym to jako „narzędzia programowe powszechnie używane przez programistów” (wymienione w FAQ jako ważne).
Autodidact
5
Naprawdę pytasz: „Jak mogę wyczyścić bufor przewijania terminala?” który jest niezależny od powłoki (Bash) lub Ubuntu.
Wstrzymano do odwołania.
@ spiderplant0 prawdopodobnie dlatego, że AskUbuntu jest właściwym miejscem do tego - w tej chwili. Nie istniało, gdy o to pytano, więc zostało zamknięte jako nie na temat, nawet jeśli tak nie jest.
jcollum
1
To bardziej ogólne pytanie, które dotyczy nie tylko Ubuntu lub bash, jak zauważył @Dennis. Chciałbym zmienić temat „Wyczyść ekran bash Ubuntu na poważnie” -> „Wyczyść ekran terminala na
poważnie
Istnieje wiele różnych typów terminali, za pomocą których można uruchomić Bash (termin „ terminal bash ” nie ma znaczenia). „Czyszczenie” nie ma zastosowania do wszystkich z nich - czasami najbliższym przybliżeniem jest oderwanie papieru i bin / shred / burn / zniszcz kawałek, którego nie chcesz.
Toby Speight

Odpowiedzi:

500

Użyj następującego polecenia, aby zrobić wyraźny ekran zamiast zwykłego dodawania nowych wierszy ...

printf "\033c"

tak, to jest „printf” w wierszu polecenia bash.

Prawdopodobnie będziesz chciał zdefiniować alias ...

alias cls='printf "\033c"'

Wyjaśnienie

\033 == \x1B == 27 == ESC

Staje się <ESC>cto kodem ucieczkowym VT100 do resetowania terminala. Oto kilka informacji o kodach ucieczki terminala.

Edytować

Oto kilka innych sposobów na zrobienie tego ...

printf "\ec" #\e is ESC in bash
echo -en "\ec" #thanks @Jonathon Reinhart.
# -e    Enable interpretation of of backslash escapes
# -n    Do not output a new line

KDE

Powyższe nie działa na konsoli KDE (zwanej Konsolą), ale jest nadzieja! Użyj poniższej sekwencji poleceń, aby wyczyścić ekran i bufor przewijania wstecz ...

clear && echo -en "\e[3J"

A może użyj następującego aliasu w KDE ...

alias cls='clear && echo -en "\e[3J"'

Mam stąd polecenie przewijania do tyłu .

Samouk
źródło
4
To jest właściwie specyficzne dla terminala. "\033c"to ESC csekwencja ucieczki VT-XXX dla „Pełny reset (RIS)”. Prawie wszystkie terminale, z których ludzie korzystają obecnie, są kompatybilne z VT, ale jeśli kiedykolwiek będziesz używać dziwnego terminala, może to nie działać. Odpowiedź @ vpit3833 jest bardziej prawdopodobna, jeśli TERM jest ustawiony poprawnie.
Laurence Gonsalves
2
printfjest wbudowanym Bash (to prawda, że ​​jest to także osobny plik binarny, ale wbudowane mają pierwszeństwo i większość współczesnych powłok ma printf).
Wstrzymano do odwołania.
2
@ SDX2000 OK ... Wiem, że wybrałeś Ubuntu i założyłem, że będą się one zachowywać podobnie na wszystkich „nowoczesnych” emulatorach terminali. Początkowo testowałem na terminalu MAC i nie zresetował się tam, ale zresetował się na moim Centos Linux.
nhed
12
echo -en "\ 033c"
Jonathon Reinhart
2
0,02 $ kilka lat później, ale jestem studentem CU. Zapytałem mojego profesora systemów operacyjnych i powiedział, że jest to przykład sekwencji ucieczki ANSI: en.wikipedia.org/wiki/ANSI_escape_code To jest przykład sygnalizacji wewnątrz pasma.
abgordon,
216

Spróbować reset. Czyści ekran terminala, ale do poprzednich poleceń można uzyskać dostęp za pomocą strzałki lub dowolnego przypisanego klawisza.

vpit3833
źródło
3
Dzięki! Ale usuwa wszystko, w tym monit. Zobacz moją odpowiedź na rozwiązanie, które tego nie robi.
Autodidact
5
@ SDX2000 Oba wyczyszczą monit, a następnie powłoka wygeneruje nowy. Jedyną wadą resetowania jest to, że wydaje się być nieco wolniejszy (prawdopodobnie dlatego, że nie tylko emituje ESC c), ale jest bardziej przenośny.
Laurence Gonsalves
@Laurence dzięki za wyjaśnienie ... Próbowałem zresetować, ale było tak wolno, że zakładałem, że monit został wyczyszczony wraz ze wszystkim innym. Nadal wolę używać, ESC cponieważ prawdopodobnie nigdy nie użyję żadnego innego terminala niż ten, którego używa Ubuntu. Chociaż resetmoże się przydać, gdy debuguję zdalną maszynę przez port szeregowy itp.
Autodidact
1
@ SDX2000 reset jest również przydatny w przypadkach, w których terminal jest poważnie zniekształcony, ponieważ zabiłeś coś (lub przechwyciłeś plik binarny) i pozostawiłeś swój termin w zniekształconym stanie. Czy kiedykolwiek przechodziłeś do stanu, w którym pojawia się monit, ale nie piszesz, a kiedy naciskasz, wprowadź nowy monit obok poprzedniego monitu, a nie pod nim? reset naprawia to. To właściwie wszystko, do czego go używam ... Nigdy nie miałem potrzeby / chęci wyczyszczenia bufora przewijania.
Laurence Gonsalves,
4
Jednosekundowe opóźnienie z tym związane resetjest dla mnie nie do zniesienia.
Jonathon Reinhart
62
tput reset

To załatwi sprawę!

Społeczność
źródło
2
Wykonuje się znacznie szybciej niż zwykły reset, ale nadal działa!
Ponkadoodle,
1
Szybciej niż tylko reset
l2aelba,
Nie zawsze tak było, ale zrobiło to tput clear
InterLinked
7

Żadna z odpowiedzi, które przeczytałem, nie działała w PuTTY, więc znalazłem komentarz do tego artykułu :

W ustawieniach połączenia, w „Window-> Behavior” znajdziesz ustawienie „System Menu pojawia się tylko na ALT”. Następnie CTRL + L, ALT, l (to mała litera L) przewinie ekran, a następnie wyczyści bufor przewijania.

(dotyczy OP, ponieważ łączę się z serwerem Ubuntu, ale najwyraźniej jest również istotny bez względu na to, na jakim serwerze działa).

TecBrat
źródło
3-letni komentarz @Dennis Williamson doprowadził mnie do tej odpowiedzi.
TecBrat
Ponadto, biorąc pod uwagę, że w ustawieniach „okienko” kit „pojawia się menu System na Alt-Space” został aktywowany można szybko zrobić CTRL+Lpotem ALT+Space, Uktóry najpierw czyści okno terminalu następnie resetuje przewijania za prawdziwe.
Pierre Voisin,
6

Poniższy link wyjaśni, jak ustawić ten alias na stałe, abyś nie musiał go ciągle wpisywać.

/ubuntu/17536/how-do-i-create-a-permanent-bash-alias

Są to kroki opisane pod tym linkiem.

  1. vim ~ / .bashrc lub gedit ~ / .bashrc lub jakikolwiek inny edytor tekstu, który ci się podoba
  2. umieść alias cls = 'printf "\ 033c"' na dole pliku
  3. Zapisz i wyjdź
  4. . ~ / .bashrc (i tak, powinna być spacja między. i ~)
  5. teraz sprawdź, czy wszystko działało!

Nie ufam, że informacje te zostały przekazane.

N1mr0d
źródło
4

Moje ulubione przyjazne dla ludzi polecenie to:

reset

Testowane na Xterm i VT100. Pomaga również po nienormalnym zakończeniu programu. Zachowuje bufor poleceń, więc strzałka w górę będzie cyklicznie przechodzić przez poprzednie polecenia.

na zdrowie: D

elbedoit
źródło
3

Wiem, że rozwiązanie polegające na drukowaniu nowych linii nie jest zbyt obsługiwane, ale jeśli wszystko inne zawiedzie, dlaczego nie? Zwłaszcza, gdy ktoś pracuje w środowisku, w którym ktoś inny może widzieć ekran, ale nie może rejestrować keylogu. Jednym potencjalnym rozwiązaniem jest zatem następujący alias:

alias c="printf '\r\n%.0s' {1..50}"

Następnie, aby „wyczyścić” bieżącą zawartość ekranu (a raczej ukryć je), wystarczy wpisać c+Enterw terminalu.

nemesisfixx
źródło
2

Wystarczy dodać, że tmuxbufor przewijania nie jest czyszczony za pomocą clear, resetlub printf. Trzeba :clear-history. Zobacz link .

theaws.blog
źródło
-2
echo -e "\e[3J"

Działa to w maszynach z systemem Linux

Nithin
źródło
4
Chociaż dziękujemy za odpowiedź, byłoby lepiej, gdyby stanowiła dodatkową wartość oprócz innych odpowiedzi. W takim przypadku Twoja odpowiedź nie zapewnia dodatkowej wartości, ponieważ inny użytkownik już opublikował to rozwiązanie. Jeśli poprzednia odpowiedź była dla Ciebie pomocna, powinieneś głosować zamiast powtarzać te same informacje.
Toby Speight
-53

Skompiluj tę aplikację.

#include <iostream>
#include <cstring>

int main()
{
  char str[1000];
  memset(str, '\n', 999);
  str[999] = 0;
  std::cout << str << std::endl;
  return 0;
}
Max
źródło
33
Przepraszamy, ale to nie jest najlepsze rozwiązanie. Są lepsze metody niż wyrzucanie 999 nowych linii
pbfy0,
2
W rzeczywistości ma to pewną wartość. W niektórych terminalach wyczyszczenie ekranu innymi metodami zabije historię i nie pozwoli ci przewinąć wstecz ... chociaż przy 999 liniach mój palec by się zmęczył. Biedny koleś.
JoshuaDavid
@JoshuaDavid Chodziło o to, że OP nie chciał mieć możliwości przewijania po wyczyszczeniu.
Socowi,
@Socowi Mój komentarz dotyczył tej źle ocenianej odpowiedzi, a nie OP. Ale masz rację!
JoshuaDavid