Если вы ищете способ проверки из скрипта, вы можете сделать одно из следующих:
- Беги
tput colsи tput lines, как подсказывает Манатворк
- проверьте значения $ LINES и $ COLUMNS
Но если вы хотите детали, здесь мы идем:
Для виртуальных терминалов (xterm и др.) Существует ioctl()системный вызов, который сообщит вам, каков размер окна. Если это возможно, lessиспользует этот вызов. Кроме того, когда вы изменяете размер окна, все, что работает в этом окне, получает SIGWINCHсигнал, который дает lessпонять, что он должен проверить новый размер окна. Например, я запустил lessзапуск (как идентификатор процесса 16663), подключился к нему straceи изменил размер окна. Вот что я увидел:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
Это также то, что tput colsи tput linesделают за кадром, если могут. Для получения дополнительной информации об этом методе см. man tty-ioctlИ найдите TIOCGWINSZ.
Для других терминалов, таких как те, которые подключены к последовательным портам, нет никакой возможности получить эту информацию напрямую В этом случае lessначинает искать ключи в переменных среды.
LINESи COLUMNSчасто будет установлен на размеры терминала. Фактически, если bashили zshможет найти размеры терминала, он автоматически сам установит эти переменные, чтобы не очень умные программы могли видеть размер терминала. Однако большинство других оболочек, включая dashи tcsh, не устанавливают эти переменные.
TERMобычно устанавливается на тип терминала, и в этом случае база данных terminfo может содержать ожидаемый размер терминала. Если tput rowsне удается использовать IOCTL (например, если вы подключены через последовательный порт), он вернется к значениям, записанным здесь. Для терминала, размер которого может измениться, это только предположение и, вероятно, будет неверным.
Для получения дополнительной информации см. man tputКоманду для управления терминалом и man terminfoсписок вещей, которые вы можете указать терминалу делать.