Podczas korzystania z konsoli szeregowej mojego systemu zawsze kończę na $COLUMNS=80
i $LINES=24
.
Chociaż mogę ręcznie zmienić te zmienne, jest to trochę denerwujące, gdy zmienia się okno terminala po stronie klienta.
Zwykle łączę się z konsolą za pomocą screen /dev/mytty baudrate
.
Zmiana $TERM
zmiennej środowiskowej na „screen” lub „xterm” nie pomaga.
Czy będę musiał zadzwonić getty
z niektórymi z nich zamiast vt100?
Nie trzeba dodawać, że wszystko to działa dobrze, gdy łączę się z tym samym komputerem za pomocą ssh.
źródło
[[ $(tty) == /dev/ttyS0 ]] && trap res2 DEBUG
do jednej z konfiguracji profilu powłoki (np./etc/profile
,~/.bash_profile
). Spowoduje to, że będzie on uruchamiany po każdym pojedynczym poleceniu (co byłoby dobrze, jeśli zmieniasz rozmiar okien / paneli za pomocą screen / tmux / emulator terminala).res
ires2
są zbyt powolne dla bynajmniej stosowania na pierwszego logowania. Na moich komputerach oba zajmują 0,5 sekundy, aby zakończyć ... sprawiając, że wszystkie moje polecenia wydają się powolne (gdy są używane z pułapką DEBUG). Ups! Nie mogę tego mieć. Chyba będę instalowałxterm
.resize
jest znacznie szybszy - zwykle 0,002 s.busybox
wydawała mi się równie powolna.resize
nie ma opcji.Dla przypomnienia, oto odpowiedź na ten problem (wygrał Usenet):
Aplikacje działające wewnątrz konsoli wirtualnych aplikacji terminalowych (
xterm
,rxvt
i przyjaciół) otrzymająSIGWINCH
po operacji doszło do zmiany rozmiaru. W ten sposób aplikacja będzie mogła przerysować okno itp. W odpowiednim module obsługi sygnału.Niestety przy użyciu konsoli szeregowej nie ma takiego mechanizmu.
Możliwe jest jednak, że aplikacja będzie aktywnie pytać o bieżący rozmiar okna konsoli. Drugą najlepszą rzeczą jest zrobienie tego za każdym razem, gdy powłoka drukuje wiersz polecenia.
Można to osiągnąć najpierw poprzez skompilowanie specjalnego pliku wykonywalnego zmiany rozmiaru, a następnie użycie następujących poleceń
bashrc
:Oczywiście nie zmieni to ustawień rozmiaru konsoli w aplikacji konsoli podczas działania.
źródło
resize
zainstalowana w systemie.Terminale „skalowalne” jako takie są wynikiem NAWS (
Negotiate About Window Size
z opcji rozmiaru okna Telnet RFC 1073 ).Jeśli jesteś podłączony bezpośrednio do komputera za pomocą portu szeregowego, nie ma żadnych negocjacji, a komputer nie ma bezpośredniej wiedzy o wielkości ekranu twojego terminala.
Jeśli terminal może wynegocjować rozmiar, komputer wyśle
SIGWINCH
do aplikacji działających w terminalu, informując go o zaktualizowaniu pojęcia rozmiaru ekranu.Gdy komputer nie zna rozmiaru ekranu, zwykle ustawia rozmiar pokazany jako
stty -a
(wiersze i kolumny) na zero. Do użytku interaktywnego jest to trochę nieprzyjazne, a niektóre systemy używają zmiennych środowiskowychLINES
iCOLUMNS
do pomocy. Przypisane wartości mogą pochodzić z opisu terminala; częściej są po prostu zakodowane na stałe. Konwencja dla tych zmiennych wymaga, abyuse_env
zadziałały, chyba że zostaną wyraźnie wyłączone, np . W funkcji aplikacji curses . Z drugiej strony zmienne te mogą być przydatne, gdy nie są dostępne wiarygodne informacje. Z drugiej strony nie ma dogodnej metody zmiany tych zmiennych.resize
Programu (narzędzie wyposażonyxterm
) można użyć sekwencję wyjściową raporcie pozycji, kursor VT100-ustalania rozmiaru obrazu. Można to uruchomić z wiersza poleceń; (ponownie) nie ma dogodnego sposobu, aby to zrobić automatycznie. Jako efekt ubocznyresize
aktualizuje informacje o wierszach / kolumnach wyświetlanych przezstty
. Jego użycie do dostarczania zaktualizowanych zmiennych środowiskowych jest przydatne głównie w przypadkach takich jak ten, gdzieLINES
i gdzieCOLUMNS
są ustawione, i należy je zaktualizować.źródło
Oto inne rozwiązanie, które działało dla mnie świetnie na moim wbudowanym systemie Linux (Overo z uruchomioną Angstrom). Właśnie uruchomiłem go z mojego pliku .bashrc. Nie chciałem używać zmiany rozmiaru, ponieważ wymaga to instalacji niektórych pakietów X i nie chciałem tego.
Informowanie Raspberry Pi, że twój terminal jest większy niż 24 linie | Blog Shallow Thoughts
źródło
Jeśli zamiast tego możesz użyć FreeBSD, dostępna jest komenda resizewin (1) , która robi dokładnie to, co chcesz.
źródło
Podczas uruchamiania sesji powłoki przez linię szeregową wystarczy wywołać
resize
polecenie wewnątrz tej sesji - po ustanowieniu połączenia i po każdej zmianie geometrii terminala.resize
Komenda jest częścią xterm ale nie zależy na X11. Na przykład w Fedorze jest osobno pakowany jakoxterm-resize
.Jak to działa: polecenie zmiany rozmiaru mierzy wysokość / szerokość za pomocą niektórych ruchów kursora, a następnie wysyła te wartości do terminala za pomocą sekwencji ucieczki.
W przypadku powłoki takiej jak zsh powoduje to również automatyczną aktualizację zmiennych
LINES
iCOLUMNS
(alternatywnie można ocenić instrukcje eksportu, które polecenia wypisują na standardowe wyjście).Dlaczego jest to konieczne: w sesji lokalnej lub ssh terminal może zasygnalizować sesji zmiany geometrii (patrz SIGWINCH). Ten mechanizm nie działa przez połączenie szeregowe.
źródło
Oto prosta i szybka funkcja zmiany rozmiaru, która działa tylko w przypadku bash. Jest modyfikowany z wersji phk res2, wykorzystując bash,
read -d delim
aby uniknąć przekroczenia limitu czasu na zakończenie odczytu.źródło