Як знайти кількість доступних вертикальних ліній в терміналі?


12

Я пишу сценарій, який показує журнал git для каталогу, коли я входжу в нього. Такий колод може бути непосильним, що містить сотні рядків. Поки що я обмежував це жорстко закодованими 20 рядками ( ... | head -n 20), що добре на екрані на роботі, але занадто багато на меншому екрані MacBook вдома.

Я вважаю за краще, щоб журнал займав приблизно половину (вертикального) екрана на будь-якому терміналі. І "термінал" також змінюється: це термінал Gnome на роботі, але iTerm2 вдома. І я не використовую екран або tmux.

Як мені знайти кількість вертикальних ліній, доступних у терміналі, з командного рядка?

Відповіді:


21

Параметри терміналу зберігаються як $LINESі $COLUMNSзмінні.

Додатково ви можете скористатися спеціальною програмою термінальної роботи, наприклад 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.

9
LINESі COLUMNSвстановлюються лише деякими снарядами. bashвстановлює їх, але лише для інтерактивної оболонки (і вона не експортує їх).
mr.spuratic

1
Середовища вар не існують у моєму tcsh. Також мені цікаво, чи змінила б їх система, якщо змінити розмір вікна терміналу. І tput, і stty працюють на мене, тому я дізнався щось нове :-)
jamesqf

В документації @jamesqf bash написано "Автоматично встановлюється після отримання SIGWINCH." так, так, він змінює їх, якщо змінити розмір вікна терміналу.
Селада

Для автоматичного набору вище варіантів відповідають наступні параметри, shopt -s checkwinsizeякі додані у мій /etc/bash.bashrcфайл із коментарем:# check the window size after each command and, if necessary, update the values of LINES and COLUMNS.
Costas

9

Ця команда повинна вказати кількість рядків на терміналі:

stty size | cut '-d ' -f1

Деякі системи можуть не реалізувати, stty sizeтому вам може знадобитися щось подібне:

stty -a | tr \; \\012 | grep rows | tr -d ' rows'

1
Це здається дуже специфічним для ОС. Чи можете ви скласти список систем, де працює кожен заклик?
Warren Young

4
Я побоювався, що перший може бути специфічним для ОС, тому я додав другий. Дійсно після трохи гуглінгу я бачу, що перший, мабуть, не працюватиме на Solaris. Другий повинен бути дуже портативним. Чесно кажучи, @Costas tput linesздається кращою відповіддю, і я його схвалив. Я про це раніше не знав.
Селада

1
Я хотів би запропонувати замінити довгу трубу stty -aчимось на кшталт grep -Po 'rows \K[^;]*'абоsed -n 's/.*rows \([^;]*\).*/\1/p'
Costas

@Costas насправді, розчаровує, ні моя команда, ні хтось із ваших не працювали на MacOS, тому мені довелося придумати ще одну команду (відредаговано). Діаграма: MacOS випускає "24 рядки" замість "рядки 24"! Я все ще думаю, що tput linesце набагато краще, і я думаю, що це досить портативно!
Селада,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.