Если вы ищете способ проверки из скрипта, вы можете сделать одно из следующих:
- Беги
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
список вещей, которые вы можете указать терминалу делать.