Jak rozwiązać problem zepsutym ekranem terminala? (zwykle po zmianie rozmiaru)


75

Czasami ekran terminala jest zawalony, a kiedy używamy man lsdo czytania stron podręcznika lub naciskamy strzałkę W GÓRĘ, aby przejść do poprzednich poleceń w historii, ekran wyświetla znaki niewłaściwe. (na przykład potraktuj koniec ekranu jak miejsce w środku ekranu).

Polecenie resetzostało wypróbowane i nie zadziałało. Jednym ze sposobów, który działa, jest wylogowanie się lub zamknięcie okna, a następnie zmiana rozmiaru okna, a następnie zrobienie ssh(lub zamknięcie tej karty i zmiana rozmiaru okna, a następnie otwarcie nowej karty, aby uzyskać nową powłokę).

Ale w ten sposób stracimy wszystko, co wcześniej zrobiliśmy, takie jak uruchomienie konsoli maszyny wirtualnej itp. Więc jeśli nie zamkniemy powłoki, czy istnieje sposób na rozwiązanie tego problemu?

(stało się to wcześniej w Fedorze, a także w przypadku Macbooka sshw pudełku RHEL 5.4).

Aktualizacja: Teraz pamiętam, jak to się stało w Fedorze: otworzyłem terminal i wykonałem FreeVM, aby użyć konsoli maszyny wirtualnej (powłoki). Myślę, że był to rozmiar 80 x 25, a potem po pewnym czasie zmieniłem rozmiar terminalu w przybliżeniu na 130 x 50, a potem „wewnętrzna powłoka” (VM) zaczęła się dziwnie zachowywać).


Jakiego emulatora terminala używasz? Brzmi zepsuty, jeśli resetnie rozwiązuje problemu.
jordanm

jakikolwiek program Terminal w Fedorze ... i domyślny program Terminal w Mac OS X Lion.
nopole

Proszę zobaczyć aktualizację powyżej, jak to się stało w Fedorze
nopole

3
Magiczne zaklęcie jest ^Jreset^J, gdzie ^Joznacza prasowaniem ctrl-J. Lub (na terminalach graficznych) możesz wypróbować Resetprzycisk. Ponadto niektóre programy po prostu nie są przygotowane na zmiany rozmiarów terminali pod nimi (tak, starożytne oprogramowanie żyje i kopie) lub po prostu źle się zachowuje, gdy terminal staje się zbyt mały.
vonbrand

1
Moje problemy wynikały z błędnego obliczenia długości zachęty, ponieważ zawierała ona kody kolorów; Brakowało mi znaków ucieczki \ [i \] - patrz unix.stackexchange.com/questions/105958/...
qneill

Odpowiedzi:


93

Jeśli używasz bash, sprawdź, czy opcja „checkwinsize” jest aktywowana w sesji przy użyciu

shopt | grep checkwinsize

Jeśli nie dostaniesz

checkwinsize    on

następnie aktywuj za pomocą

shopt -s checkwinsize

Dokumentacja Bash mówi o atrybucie „checkwinsize”:

„Jeśli ustawione, Bash sprawdza rozmiar okna po każdym poleceniu i, jeśli to konieczne, aktualizuje wartości LINII i KOLUMN.”

Jeśli podoba Ci się to ustawienie, możesz je aktywować checkwinsizew swoim ~/.bashrc.

  • Aktywować: shopt -s checkwinsize
  • Aby dezaktywować: shopt -u checkwinsize

6
To nie rozwiązuje mojego problemu, ale to dobra ogólna odpowiedź, więc i tak +1. Myślę, że mój problem dotyczy emulacji systemu Windows (?) Podczas ssh-sowania na serwerze Linux.
genorama

Na początku wydawało się, że to nie działa, gdy użyłem strzałek w górę, aby zobaczyć historię, ale zaraz po pierwszym wykonanym poleceniu naprawiło wszystko. Używam terminatora w moim przypadku. Dzięki +1
kstenger,

działało to dla mnie, ale tylko poprzez wyłączenie checkwinsize. z jakiegoś powodu LINES = 24 ustawiano po każdym poleceniu, mimo że moje okno (zawierające sesję picocom) było znacznie wyższe.
Michael

19

Możesz spróbować Ctrl+ L. Czyści i / lub przerysowuje ekran terminala, w zależności od programu.


3
ale to nie rozwiązuje na stałe problemu ...
nopole

Myślę, że miałem na myśli to, że jeśli naciśniesz CTRL L, to linia jest w tej chwili w porządku, ale jeśli ponownie edytujesz linię (lub w następnym
wpisanym

11

dodanie tych opcji do exec dockera wydawało się rozwiązać mój problem

-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM

1
czy to ty zadałeś to pytanie 5 lat temu?
Archemar

3
Mogę powiedzieć, że nie jest: „doker” tak naprawdę nie pasuje do „5 lat temu”. Docker nie został jeszcze wydany w styczniu 2013 r .;-)
jplandrain

8

Miałem ten sam problem i żaden z powyższych przepisów nie działał dla mnie, ponieważ uważam, że mój bash nigdy nie odbiera SIGWINCHsygnałów, które są uwięzione przez proces macierzysty.

W końcu znalazłem rozwiązanie. Dodałem do mojego .bashrc:

export PROMPT_COMMAND="resize &>/dev/null ; $PROMPT_COMMAND"

Teraz za każdym razem, gdy pojawia się nowy monit, moje okno jest ponownie dostosowywane.

Dzięki UKmonkey za ulepszenie PROMPT_COMMAND.


2
Ja osobiście poszedłbym z export PROMPT_COMMAND="resize &>/dev/null; $PROMPT_COMMAND"tym, aby stare szybkie polecenie, cokolwiek by to było, zostanie zachowane
UKMonkey,

Chciałbym po prostu ręcznie zmienić rozmiar w razie potrzeby. Przesłuchanie konsoli pod kątem rozmiaru może być powolne. Wykonanie tego sprawia, że ​​każde polecenie wydaje się przesadne i zwykle wiesz, kiedy zostało zmienione.
Conrad Meyer,

6

Chciałem tylko dodać do tego, o czym Arcadien już wspomniał. Włączenie checkwinsize załatwia sprawę, ale dla mnie konieczne było zresetowanie rozmiaru okna, aby działało poprawnie. Myślę, że checkwinsize miał to wyeliminować, ale nadal warto spróbować. Po prostu spróbuj zmienić rozmiar okna lub un-maksymalizować i maksymalizować to po tej opcji.


1
Wierzcie lub nie, tylko tyle zajęło mojemu naprawienie. Zabawne, bo najpierw spróbowałem wszystkiego innego.
taranaki

4

Od czasu do czasu mam ten sam problem, używając Zsh na MacOS. Proste wywołanie resetpolecenia ponownie ustawia terminal zgodnie z moimi upodobaniami.


Więc OP wspomniał, że resetto nie działało dla nich, i to było w istocie pytanie…
Stephen Rauch

OP wspomniał o tym, że nie działa na smakach Linuksa. Napotkałem problem na MacOS Sierra i resetpracowałem w tej sprawie. Dodałem tę odpowiedź, aby pomóc każdemu, kto napotyka ten sam problem na MacOS i nie jest świadomy resetpolecenia.
nonocut

resetdziała na Windows Putty z Ubuntu 16.04!
musbach

reset działał na Ubuntu 16.04 zsh
A.Wan

2

Miałem ten sam problem co ty i właśnie to zrobiłem:
mam .profilekonfigurację w moim użytkowniku, więc tutaj dokonuję wszystkich zmian.

Istnieje pakiet o nazwie, xtermktóry jest dostępny przez apt-get, o którym nie wiem yum. Ale zrobiłem lokalną instalację ze źródła, ponieważ nie mam uprawnień do instalacji. LINK: http://invisible-island.net/xterm/#download

./configure --prefix=/the/path/you/want/to/install/to
make
make install

Wyeksportowałem ścieżkę do mojego profilu i wywołałem ją w tym samym miejscu

export PATH=$PATH:/the/path/you/want/to/install/to
resize

Więc teraz za każdym razem, gdy się loguję, rozmiar terminala jest odpowiednio ustawiany przez zmianę rozmiaru.


0

To jest powszechny problem i powinno być proste rozwiązanie.

Jeśli inne miary, takie jak Ctrl + A Ctrl + L, nie działają, spróbuj użyć stty:

  1. Ctrl + T: Otwórz nową kartę z lokalną powłoką.
    Lub: Opuść ekran (Ctrl + AD, aby odłączyć) i wyloguj się z sesji SSH.
  2. stty -a | grep rows: Uzyskaj liczbę wierszy i kolumn.
    Przykład:speed 38400 baud; rows 33; columns 133; line = 0;
  3. Wróć do karty zdalnej lub zaloguj się i ponownie podłącz ekran. Wynik sttypowinien być inny.
    Przykład:speed 38400 baud; rows 47; columns 177; line = 0;
  4. Wpisz stty rows Ni stty columns Ngdzie N to „rzeczywista” liczba (poza ekranem). Przykład:$ stty rows 33; stty columns 133

Jeśli używasz Terminatora , możesz pominąć pierwsze trzy kroki, ponieważ pokazuje on liczbę kolumn i wierszy u góry.

Nie musisz zmieniać rozmiaru okien terminala, aby na to wpaść. Administratorzy zwykle logują się z różnych komputerów, a gdy podłączone monitory różnią się rozmiarem (rozdzielczością), maksymalizowane okno będzie miało inny rozmiar na każdym komputerze. Naprawdę trudno jest nie wpaść na to często.

W rezultacie nie tylko niektóre strony podręcznika nie wyświetlają się poprawnie. To prawie wszystko, co korzysta z pagera - często brakuje kilku pierwszych wierszy (na przykład). I nawet nie myśl o użyciu VIM w tak źle wyregulowanym terminalu. Chcesz podświetlić wiersz 3 (V), aby go zastąpić, ale kiedy to zrobisz, podświetlony tekst jest tekstem z innego wiersza.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.