SIGWINCH, bash, da sh, tput и terminfo - PullRequest
0 голосов
/ 21 апреля 2020

Меня немного смущает взаимодействие между tput и размерами терминала. Кажется, что поведение tput зависит от оболочки, в которой он вызывается, или, возможно, оболочка отвечает за изменение настроек терминала или ... что-то. Чтобы уменьшить проблему, рассмотрим:

dash$ exec bash
bash$ trap 'echo winched' WINCH
bash$ tput cols
176
bash$ # changing terminal size now (after hitting return)
bash$ winched
bash$ winched
tput cols
150
bash$ exec dash
dash$ trap 'echo winched' WINCH
dash$ tput cols
150
dash$ # changing terminal size now (after hitting return)
dash$ tput cols
winched
150

Здесь, в bash, все ведет себя (почти), как ожидалось (я говорю почти, потому что я не совсем уверен, почему обработчик WINCH выполняется дважды), и вывод tput изменяется в соответствии с новым размером терминала. Однако при работе в da sh вывод tput не изменяется, даже если размер терминала изменился. Также обратите внимание, что обработчик WINCH, кажется, задерживается на da sh и не выполняется до тех пор, пока не будет введена следующая команда (но до того, как она выполнится). Что здесь должно произойти? tput как-то заботится о том, что делает оболочка? Является ли лебедка вообще актуальной? Я предполагаю, что вопрос:

Как tput знает размер терминала?

Кроме того, я не хотел слишком сильно загромождать вывод, но в каждой оболочке Например, TERM установлен и infocmp $TERM выводит описания terminfo, которые кажутся действительными. (Тот факт, что он дает какой-либо вывод, я думаю, указывает на то, что это действительные данные!)

1 Ответ

1 голос
/ 21 апреля 2020

Это не очевидно из описания:

-T type
указывает тип терминала. Обычно этот параметр не требуется, поскольку значение по умолчанию берется из переменной среды TERM. Если указано -T, то переменные оболочки LINES и COLUMNS также будут игнорироваться.

но текущий tput вызовы use_env и use_tioctl для -T опция:

20171007
    + modify "-T" option of clear and tput to call use_tioctl() to obtain
      the operating system's notion of the screensize if possible.

Страница справочника tput имеет раздел Размер терминала , который более подробно описан .

Этот пример (с использованием ncurses 6.1) работает должным образом:

#!/bin/bash

trap "resize; tput cols; tput -T$TERM cols" WINCH

while true
do
        sleep 1
done

С ncurses 6.0 вы увидите эту разницу. С другими реализациями ymmv .

Относительно bash, который обсуждался некоторое время назад: tput cols не работает должным образом в скрипт (но этот вопрос не имеет никакого отношения к опции -T).

...