Как найти количество вертикальных линий, доступных в терминале?

12

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

Я бы предпочел, чтобы журнал занимал примерно половину (вертикального) экрана на любом терминале. И «терминал» тоже меняется: это терминал Gnome на работе, а iTerm2 дома. И я не использую screen или tmux.

Как узнать количество вертикальных линий, доступных в терминале из командной строки?

jalanb
источник

Ответы:

20

Параметры терминала хранятся как $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». так что, да, это изменит их, если вы измените размер окна терминала.
Селада,
Для автоматической настройки выше, vaiable, отвечают следующие параметры, 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'
Celada
источник
1
Это кажется очень специфичным для ОС. Можете ли вы составить список систем, где работает каждое заклинание?
Уоррен Янг
4
Я боялся, что первый может быть специфичным для ОС, поэтому я добавил второй. Действительно, после небольшого поиска в Google, я вижу, что первый, вероятно, не будет работать на Solaris. Второй должен быть очень портативным. Честно говоря, @Costas ' tput linesкажется лучшим ответом, и я проголосовал за него. Я не знал об этом раньше.
Селада,
1
Я хотел бы предложить заменить длинную трубу stty -aчем-то вроде grep -Po 'rows \K[^;]*'илиsed -n 's/.*rows \([^;]*\).*/\1/p'
Costas
@Костас, к сожалению, ни моя команда, ни ваша команда не работали на MacOS, поэтому мне пришлось придумать еще одну команду (отредактировано). Идите фигура: MacOS испускает «24 строки» вместо «строки 24»! Я все еще думаю, что tput linesэто намного лучше, и я думаю, что это довольно портативный!
Селада