Эмулировать количество столбцов для программы в терминале

Проблема заключалась в том, что файл конфигурации по умолчанию назывался 50-defaults.conf, поэтому он обрабатывался первым...

Это означает, что журналы отправляются в /var/log/syslogв соответствии с конфигурацией по умолчанию, а затем они проходят через мой файл конфигурации, который выполняет остановку, но это не имело значения, потому что после этого ничего не было.

Переименовав его в 10-myapp.conf, проблема устранена.

0
23.10.2020, 14:05
1 ответ

Стандарт POSIX действительно таков, что значение переменной окружения COLUMNSзаменяет другие способы получения размера терминала. Стандарт описывает одну из целей переменной как «отображение данных в области, произвольно меньшей, чем терминал или окно», среди прочего, что соответствует тому, что вы хотите.

Эти другие способы не стандартизированы, но они обычно представляют собой ioctl()из TIOCGWINSZпо отношению к дескриптору открытого файла терминального устройства. Ваша программа делает это; хотя он просто предполагает без проверок isatty(), что его стандартный вывод является терминальным устройством.

К сожалению, есть программы, которые не учитывают переменную окружения COLUMNS, и ваша, к сожалению, одна из них. Вместо этого он предоставляет собственный идиосинкразический нестандартный механизм -, настройки detectionи defaultwidthв своем файле конфигурации.

Огорчает то, что они работают наоборот COLUMNSпеременной окружения. Они являются запасным вариантом, а не переопределением. Вы должны отключить detection, чтобы программа перестала использовать TIOCGWINSZи вернулась к значениям по умолчанию. Затем вы должны установить значение для defaultwidth, которое равно 80, если не установлено, и 65536 с принудительным отключением обнаружения, если оно равно нулю.

Дальнейшее дополнение к печали заключается в том, что отключение detectionотносится как к ширине, так и к высоте,в отличие от стандартных переменных POSIX COLUMNSи LINES, которые работают независимо друг от друга. Таким образом, вы также должны позаботиться о defaultheight, который равен 24, если не установлен, и 65536 с принудительным обнаружением, если ноль.

Вы могли бы , в качестве альтернативы, оставить обнаружение включенным и вместо этого обмануть свою программу с помощью псевдо-терминала -. tmux— это сложный способ добиться этого со всеми этими ключами и использованием промежуточных файлов. Использование Бернштейна ptybandageиstty columns(для внутреннего псевдо-терминала -)проще, занимает одну строку и выводит на стандартный вывод в режиме реального времени по мере выполнения вашей программы :

ptybandage sh -c 'stty columns 40 ; exec task'
.

Дополнительная литература

  • Даниэль Дж. Бернштейн (1996 ).ptybandage. djbwares .
  • Джонатан де Бойн Поллард (2014 ).ptybandage. Направляющая ноша . Программное обеспечение.
2
18.03.2021, 22:56

Теги

Похожие вопросы