Jakich poleceń mogę użyć do zresetowania i wyczyszczenia terminala?

64

Korzystałem z polecenia:

reset

wyczyścić mój terminal. Chociaż jestem całkiem pewien, że nie to powinienem robić. Resetuj, jak sama nazwa wskazuje, resetuje cały terminal (zmienia wiele rzeczy). Oto czego chcę:

Zasadniczo chcę użyć polecenia clear. Jeśli jednak wyczyścisz, a następnie przewiniesz w górę, nadal otrzymujesz tony rzeczy z przeszłości. Zasadniczo nie stanowi to problemu, ale patrzę na duże dzienniki, które są długie i chcę mieć pewność, że właśnie przeglądam najnowszy. Wiem, że mógłbym użyć morelub coś takiego, ale wolę takie podejście.

sześćdziesiąt stóp
źródło
wydaje się, że istnieje wiele nieporozumień na temat tego, o co dokładnie tu pyta się. czy możesz w ogóle wyjaśnić pytanie? co dokładnie próbujesz osiągnąć, czyszcząc bufor przewijania terminalu? (jeśli tak, jakiej aplikacji terminalowej używasz?)
quack quixote
1
Ctrl-L wyczyści ekran w trybie bash (w trybie emacsa, który jest domyślny), podobnie jak w przypadku wykonywania programu czyszczenia.
Właśnie przetestowałem to w terminalu bash w IntelliJ IDE. Działa dobrze i usuwa przewijanie, które jest dokładnie tym, czego chciałem. Dzięki.
Ian Lewis
Wiem, że na to odpowiedziano na śmierć, ale myślę, że chcesz tego clear && printf '\033[3J'. Brak resetowania terminala, wystarczy wyczyścić tekst na ekranie. Zobacz ten post: superuser.com/questions/555554/…
jwd 10.10.17

Odpowiedzi:

57

Bufor przewijania nie jest funkcją bash, ale programem terminalowym. Nie powiedziałeś, jakiego terminala używasz.

Jeśli używasz Xterm, możesz być w stanie wyczyścić zapisane linie przez echo ESC-c do terminala.

Może to działać lub nie działać na każdym używanym programie terminalowym.

Na Linuksie prawdopodobnie to zadziała:

echo -e '\0033\0143'

na FreeBSD echo nie akceptuje -e, więc możesz spróbować:

printf '\033\143'
Craig
źródło
Używam xterm. Jednak nie rozumiem, co masz na myśli. Czy powinienem pisać dosłownie echo ESC-c?
sixtyfootersdude
2
@sixtyfootersdude: Nie, nie dosłownie ESC. Przeczytaj artykuły „Znak ucieczki” i „Znak sterujący” na Wikipedii - ESCczęsto używa się go do oznaczenia znaku ASCII 0x1B, który można wstawić, naciskając, ^Va następnie Esc.
grawity
1
Nie powinieneś Jeśli twoje rozwiązanie wymaga napisania surowych sekwencji ucieczki terminala, powinieneś przemyśleć rozwiązanie. Użyłbym „mniej” zamiast kota. Jeśli naprawdę chcesz dowiedzieć się o „sekwencjach ucieczki terminalu”, Google może ci pomóc.
Craig
2
@HaraldNordgren lepiej użyć bardziej standardowego printf niż echo -e.
Dobra osoba
3
Dlaczego \0143zamiast c?
ruakh
51

Użyj odpowiedniego narzędzia do każdego zadania:

  • Użyj, clearaby wyczyścić okno terminala.

  • Służy resetdo resetowania terminala, gdy zostanie on pomieszany przez sekwencje kontrolne.

  • Używaj cattylko wtedy, gdy chcesz przesyłać całą masę danych z jednego miejsca do drugiego bez przerwy .

  • Użyj programu pager, takiego jak lesslub, mostaby wyświetlić strony wyników.

  • Służy tail -f /var/log/foo.log /var/log/bar.logdo oglądania kilku różnych plików dziennika.

    • GNU tailThe -Fopcja jest lepsza, ponieważ może kontynuować po pliku, nawet jeśli pojawi się nowy plik na swoim miejscu, co jest powszechne dla plików dziennika.
duży nos
źródło
14
To tak naprawdę nie odpowiada na moje pytanie.
sixtyfootersdude
7
Tak, to działa. Nie cat plików, aby je odczytać, cat plików, aby je połączyć. Używaj mniej lub więcej, aby czytać pliki - wtedy nie masz tego samego problemu.
Rich Bradshaw
Spójrz w górę „bezużyteczne użycie kota”
Galois
Wiele osób jest przeciwnych catczytaniu czegokolwiek, ale w przypadku małych plików ma to dla catnich sens zamiast używania less. Gdy plik zostanie zrzucony do terminala, możesz przeglądać / przewijać plik do tyłu tak często, jak chcesz, zamiast konieczności anulowania, lesszanim zrobisz cokolwiek innego.
GKFX
22

Wystarczy podać odpowiedź techniczną: resetponownie zainicjuj terminal, tak jakby został ponownie otwarty od zera. stty sanewykona wiele takich samych funkcji (bez resetowania). Jest to to samo, co ^L(Ctrl + L) (irc) i tput clear. Pomimo tego, co powiedział poprzedni plakat (@grawity), clearnie wyświetla wielu nowych linii. Wysyła TERMreset tak, jak zdefiniowano w terminfolub termcap, dla mnie, używając gnome-terminal(xterm) jest to to samo co polecenie perl -e'print "\33[H\33[2J"'.

Jeśli chcesz po prostu wyczyścić bufor - w porównaniu z resetowaniem całego terminala, spróbuj tego tput reset. To powinno być bardzo szybkie, i rób co chcesz. (Chociaż naprawdę powinieneś czytać pliki less)

tput reset, wysyła wartość terminfo do zresetowania - na moim terminalu (xterm) jest taka sama jak perl -e'print "\33c"'

Evan Carroll
źródło
1
I nie nie powiedzieć clearwyprowadza kilka nowych linii. Właśnie podałem polecenie jako alternatywę dla niego, ponieważ cleartylko czyści ekran, ale nie bufor przewijania. (Nie tylko w PuTTY ani Konsole.)
grawity
1
Właśnie z tego powodu wydrukowanie kilku nowych linii nie jest tak naprawdę alternatywą dla wyczyszczenia - nie masz pojęcia, co terminal zrobi z czystym sygnałem. Lepiej jest po prostu powiedzieć nowym osobom, że masz bazę danych, która wie, jak obsługiwać terminal, ma dwie kluczowe wartości, jedną mapującą clearjako nazwę sygnału na sygnał, i drugą, która mapuje resetna sygnał - i tylko tę drugą. powoduje wyczyszczenie bufora przewijania. resetwysyła to drugie, powyżej robiąc inne fajne rzeczy.
Evan Carroll
1
Według pierwotnego pytania sixtyfootersdude jest, clearczy nie przywrócić jego przewijania. ( ESC cdziała w xtermi oparty na VTE, ale nie w PuTTY i Konsole.) On też nie chce używać reset, ponieważ resetuje więcej niż chce. (Nie wiem, którego terminala używa - ale porównuję sttyprzed i po
resecie
2
jak powiedziałem, prawdopodobnie chce tput reset, który wysyła sygnał resetowania do terminala - bez faktycznej ponownej inicjalizacji tego terminu. "reset - Zamiast zgasić ciągi inicjalizacyjne, ciągi resetowania terminala zostaną wyprowadzone, jeśli są obecne (rs1, rs2, rs3, rf). Jeśli ciągi resetowania nie są obecne, ale ciągi inicjalizacji są, zostaną wyprowadzone ciągi inicjalizacji. W przeciwnym razie reset działa identycznie jak init. ” Tutaj mamy zresetowane ciągi, więc ciągi inicjujące nie są uruchamiane.
Evan Carroll
+1: sugestia tput resetjest jednak dość powolna (taka sama jak reset). printf '\033\143'jest znacznie szybszy. Czy istnieje powód, dla którego metoda printf jest niebezpieczna / zła?
sixtyfootersdude
9

Kolejnym terminalem jest iTerm2 i ma on nieco dziwną sekwencję ucieczki używaną do czyszczenia przewijania. W powłoce Bash używam czegoś takiego:

echo -ne '\033]50;ClearScrollback\a'

w skrypcie. Zasadniczo jest to znak ESC, po nim „ ]50;ClearScrollback”, a następnie znak BEL.

Sam Mason
źródło
1
CMD + K działa w iTerm2. CTRL + K działa w wielu innych.
blockloop
Podoba mi się to rozwiązanie, ponieważ pozwala mi wyczyścić bufor przewijania iTerm2 ze skryptu powłoki, gdy coś takiego clearlub resetnie. Nie jest to jednak najlepsza odpowiedź na pytanie. Myślę, że właściwą odpowiedzią na to pytanie jest wszystko, co oferuje aplikacja terminalowa, takie jak Command-K w iTerm2, control-K w innych itp.
LS
8

Prawdopodobnie najlepszym sposobem na wyczyszczenie wszystkiego jest użycie funkcji terminala:

  • Konsola: Ctrl+ Shift+ KWidok → Wyczyść przewijanie i zresetuj
  • Terminal GNOME: Edytuj → Resetuj i Wyczyść
  • PuTTY: Ctrl+ right-click→ Wyczyść przewijanie

W ten sposób oba bufory zostaną wyczyszczone, a stan terminala zostanie zresetowany do dokładnie tego, co był podczas uruchamiania (który może, ale nie musi być taki sam, jak użycie reset).

grawitacja
źródło
Hmm, nie mam tego pod moim
krasnoludem
@sixtyfootersdude: Jestem pewien, że tam jest , po prostu nie znam dokładnego menu ( gnome-terminalw tej chwili nie mogę się użyć ) ... Spójrz na „Narzędzia” i inne menu.
grawity
W Xterm jest środkowy przycisk Ctrl -> „Resetuj i usuwaj zapisane linie”
Craig
3
mniej -W + F foo.log

+Fsłuży do „śledzenia”, podobnego do, tail -fale umożliwia także przewijanie wstecz.

Wszystkie terminale oparte na Vte (GNOME, Xfce's, Roxterm) i KDE Konsole umożliwiają przewijanie wewnątrz kółka przewijania less. Uważam to za dość wygodne.


Alternatywa dla clear:

perl -e 'print "\ n" x512;'

xterm -e 'tail -f foo.log'
grawitacja
źródło
3

W Mac OS X Terminal.app:

Widok -> Wyczyść przewijanie (lub command- K)

acajaja
źródło
@Rohit Jeśli pytanie dotyczyło konkretnie aplikacji Mac OS X Terminal.app, to tak, to świetna odpowiedź. Jednak pierwotne pytanie jest dwuznaczne, najlepiej mogę powiedzieć, w odniesieniu do tego, który terminal i system operacyjny są w grze.
David J.
2

To nie jest problem „Bash”. To zależy od używanego terminala. Na przykład używam „iterm2” z komputerem Macbook, aby podłączyć zdalną maszynę z systemem Linux. Możesz użyć „Command + K”, aby wyczyścić bufor, lub w menu wybierz „Edytuj” -> „Wyczyść bufor”.

Steven Huang
źródło
1

Aby wyczyścić ekran konsoli i bufor przewijania podczas uruchamiania PuTTY, działa to dla mnie:

echo -en "\ec\e[3J"

To właściwie 2 sekwencje „Esc”, które działają niezależnie ... można ich użyć w dowolnej kolejności:

# clears the console screen, but not the scrollback buffer
# this is actually the escape code to "reset" the terminal
echo -en "\ec"

# clears the scrollback buffer, but not the console screen
# screen content remains, and cursor position remains at its last position
echo -en "\e[3J"

Za pomocą tego, echo -en "\ec"co resetuje, terminal może zmienić niektóre inne ustawienia terminala. Zamiast „Resetuj” możesz to zrobić:

# position the cursor to "Home" (Top Row, First Column)
echo -en "\e[H"

# Erase down: clear the screen from the cursor down to the bottom of the screen.
echo -en "\e[J"

# Note: this is supposed to clear the screen and position the cursor to home,
# but it didn't work like that for me. It cleared the entire screen (above and 
# below the cursor), but left the cursor at its last position.
echo -en "\e[2J"

# putting everything together
echo -en "\e[H\e[J\e[3J"

Możesz umieścić to w skrypcie powłoki i działa dobrze.


W przypadku niektórych zależności systemowych:

Używam PuTTY Connection Manager (wersja 0.7.1 BETA (kompilacja 136)) z PuTTY (wydanie 0.60).

Pisanie na maszynie:

echo \"$TERM\"; /bin/sh --version

raporty:

"xterm"
GNU bash, version 4.1.2(1)-release-(x86_64-redhat-linux-gnu) ...
Kevin Fegan
źródło
1

Aby wyczyścić bufor ekranu dla sprzętowego TTY we FreeBSD, możesz użyć „vidcontrol - narzędzie kontroli i konfiguracji konsoli systemowej” z parametrem -C Wyczyść bufor historii.

vidcontrol -C

polecenie wyczyści cały bufor ekranu dla bieżącej konsoli powyżej tego, co widzisz w tej chwili. Możesz najpierw „wyczyścić” lub nie - do ciebie.

użytkownik
źródło
0

Jeśli chcesz mieć pewność, że patrzysz na najnowsze wpisy w pliku dziennika, prawdopodobnie najlepiej jest użyć tail zamiast clear/ catktórego, jak zakładam, używasz.

Josh K.
źródło
Właściwie używam tail -f (ciągłe logi), ale ponieważ czasami wypluwają tysiące linii, ważne jest, aby przewijać do tyłu. Jednak miło byłoby wiedzieć, że nie spoglądam z powrotem na starszy dziennik.
sixtyfootersdude
0

Hmmm. Myślę, że jeśli używasz konsoli, nie masz szczęścia. Kiedyś można było po prostu „wyczyścić przewijanie”. Konsole nie pozwoli ci już tego robić. Musisz go zresetować, aby zabijał każdy uruchomiony program. Chyba potrzebuję nowego programu terminalowego ......

Bruce
źródło