Как действительно меньше знает терминальное разрешение?

Обновление

Как mikemaccana примечания, журнал systemd является теперь стандартным устройством журналирования для большинства дистрибутивов. Просмотреть stdout и stderr из systemd единицы используют journalctl команда.

sudo journalctl -u [unit]

Исходный ответ

По умолчанию stdout и stderr из systemd единицы отправляются в системный журнал.

При использовании полного systemd это будет доступно через journalctl. На Fedora это должно быть /var/log/messages но системный журнал поместит его, где в Ваших правилах говорится.

Из-за даты сообщения, и принимающий большинство людей, которые подвергаются systemd, через мягкую фетровую шляпу, Вы были, вероятно, поражены ошибкой, описанной здесь: https://bugzilla.redhat.com/show_bug.cgi? id=754938 Это имеет хорошее объяснение того, как все это работает также =) (Это было ошибкой в selinux-политике, которая заставила сообщения об ошибках не быть зарегистрированными, и был зафиксирован в selinux-policy-3.10.0-58.fc16)

11
20.02.2018, 02:14
3 ответа

При поиске способа проверить из сценария можно сделать любой из них:

  • Выполненный tput cols и tput lines, поскольку manatwork предлагает
  • проверьте значения $LINES и $COLUMNS

Но если Вы хотите детали, здесь мы идем:

Для виртуальных терминалов (xterm, и др.) существует ioctl() системный вызов, который скажет Вам, каков размер окно. Если это может, less использование этот вызов. Кроме того, когда Вы изменяете размер окна, независимо от того, что работает в том окне, получает a SIGWINCH сигнал, который позволяет less знайте, что это должно проверить на новый размер окна. Например, я запустил a 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 может найти терминальные размеры, это автоматически установит эти переменные само, чтобы помочь not-so-clever программам видеть терминальный размер. Однако большинство других оболочек, включая dash и tcsh, не устанавливайте эти переменные.
  • TERM обычно устанавливается на терминальный тип, в этом случае terminfo база данных может содержать ожидаемый размер терминала. Если tput rows не может использовать IOCTL (например, если Вы будете соединены по последовательному порту), то он отступит к значениям, зарегистрированным здесь. Для терминала, размер которого может измениться, это - только предположение и, вероятно, будет неправильно.

Для большего количества информации посмотрите man tput чтобы команда управляла терминалом, и man terminfo для списка вещей можно сказать терминалу делать.

21
27.01.2020, 19:57
  • 1
    terminfo база данных не делает то, что было обозначено здесь. Ответ @warl0ck, который содержит меньше информации, более точен. –  Thomas Dickey 16.11.2016, 11:43
  • 2
    @ThomasDickey, Вы правы; все, что это имеет, является математическими ожиданиями. Исправленный мой ответ;спасибо. –  Jander 16.11.2016, 18:50

Если Вы будете смотреть на исходный код, то Вы будете знать less вызовы ioctl() получать размер окна на Linux.

#ifdef TIOCGWINSZ
    {
        struct winsize w;
        if (ioctl(2, TIOCGWINSZ, &w) == 0)
        {
            if (w.ws_row > 0)
                sys_height = w.ws_row;
            if (w.ws_col > 0)
                sys_width = w.ws_col;
        }
    }
#else
#ifdef WIOCGETD
    {
        struct uwdata w;
        if (ioctl(2, WIOCGETD, &w) == 0)
        {
            if (w.uw_height > 0)
                sys_height = w.uw_height / w.uw_vs;
            if (w.uw_width > 0)
                sys_width = w.uw_width / w.uw_hs;
        }
    }
#endif
7
27.01.2020, 19:57

Я не уверен, является ли это информацией, которую Вы ищете. Я предполагаю less регистрирует обработчик сигналов для SIGWINCH. Когда размер терминальных изменений, это получает a SIGWINCH предупредите и зондируйте tty информацию для текущего размера терминала. http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html

1
27.01.2020, 19:57

Теги

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