Jak znaleźć liczbę pionowych linii dostępnych w terminalu?

12

Piszę skrypt, który pokazuje dziennik git dla katalogu, gdy do niego piszę. Taki dziennik może być przytłaczający, zawierający setki linii. Do tej pory ograniczałem to do 20 zakodowanych na stałe linii ( ... | head -n 20), co jest w porządku na ekranie w pracy, ale za dużo na mniejszym ekranie MacBooka w domu.

Wolałbym, aby dziennik zajmował około połowy (pionowego) ekranu na dowolnym terminalu. Zmienia się także „terminal”: to terminal Gnome w pracy, ale iTerm2 w domu. I nie używam screena ani tmuxa.

Jak znaleźć liczbę pionowych linii dostępnych w terminalu z wiersza poleceń?

jalanb
źródło

Odpowiedzi:

21

Parametry terminala są przechowywane jako $LINESi $COLUMNSzmienne.

Dodatkowo możesz użyć specjalnego programu operacji terminowych, na przykład tput:

tput lines  # outputs the number of lines of the present terminal window.
tput cols   # outputs the number of columns of the present terminal window.
Costas
źródło
9
LINESi COLUMNSsą ustawione tylko przez niektóre powłoki. bashustawia je, ale tylko dla interaktywnej powłoki (i nie eksportuje ich).
mr. Spuratic
1
Zmienne środowiskowe nie istnieją w moim tcsh. Zastanawiam się także, czy system zresetuje je, jeśli zmienisz rozmiar okna terminala. Zarówno tput, jak i stty działają dla mnie, więc nauczyłem się czegoś nowego :-)
jamesqf
Dokumentacja bash @jamesqf mówi: „Ustawiana automatycznie po otrzymaniu SIGWINCH”. więc tak, zmienia je, jeśli zmienisz rozmiar okna terminala.
Celada,
W przypadku autosetu powyżej wykonalnego odpowiedzialne są następujące opcje, shopt -s checkwinsizektóre zostały dodane do mojego /etc/bash.bashrcpliku z komentarzem:# check the window size after each command and, if necessary, update the values of LINES and COLUMNS.
Costas
9

To polecenie powinno podać liczbę linii na terminalu:

stty size | cut '-d ' -f1

Niektóre systemy mogą nie zostać zaimplementowane, stty sizedlatego możesz potrzebować czegoś takiego:

stty -a | tr \; \\012 | grep rows | tr -d ' rows'
Celada
źródło
1
Wydaje się to bardzo specyficzne dla systemu operacyjnego. Czy potrafisz skompilować listę systemów, w których działa każda inkantacja?
Warren Young,
4
Bałem się, że pierwszy może być specyficzny dla systemu operacyjnego, dlatego dodałem drugi. Rzeczywiście po trochę Googlingu widzę, że pierwszy prawdopodobnie nie będzie działał na Solarisie. Drugi powinien być bardzo przenośny. Szczerze mówiąc, @Casas tput lineswydaje się lepszą odpowiedzią, a ja ją głosowałem. Nie wiedziałem o tym wcześniej.
Celada,
1
Chciałbym zaoferować zastąpienie długiej fajki stty -aczymś takim jak grep -Po 'rows \K[^;]*'lubsed -n 's/.*rows \([^;]*\).*/\1/p'
Costas
@Casas faktycznie, frustrująco, ani moje polecenie, ani żadne z waszych nie działało na MacOS, więc musiałem wymyślić jeszcze inne polecenie (zredagowane). Idź rysunek: MacOS emituje „24 rzędy” zamiast „wierszy 24”! Nadal uważam, że tput linesjest o wiele lepszy i myślę, że jest całkiem przenośny!
Celada,