Якщо ви шукаєте спосіб перевірити сценарій, ви можете виконати будь-який із цих дій:
- Бігайте
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список речей, які можна повідомити терміналу.