Como menos conhece a resolução do terminal?


12

Toda vez que alguém define um tamanho diferente para um console virtual, lessreconhece a resolução da janela (suponho que ...); de acordo com isso, altera quantas linhas de texto deve visualizar. Como esse parâmetro é calculado?


Uhm ... ok, mas onde posso encontrar esse procedimento que é executado?
Giuseppe Crinò

Respostas:


22

Se você estiver procurando uma maneira de verificar a partir de um script, execute um destes procedimentos:

  • Corra tput colse tput lines, como sugere o manatwork
  • verifique os valores de $ LINES e $ COLUMNS

Mas se você quiser os detalhes, aqui vamos nós:

Para terminais virtuais (xterm, et al), há uma ioctl()chamada do sistema que informará o tamanho da janela. Se puder, lessuse esta chamada. Além disso, quando você altera o tamanho da janela, o que estiver em execução nessa janela recebe um SIGWINCHsinal que informa lessque deve verificar se há um novo tamanho de janela. Por exemplo, iniciei uma lessexecução (como identificação do processo 16663), conectei a ela stracee redimensionei a janela. Isto é o que eu vi:

$ 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

Isso também é o que tput colse tput linesfazer nos bastidores, se puderem. Para mais informações sobre esse método, consulte man tty-ioctle pesquise TIOCGWINSZ.

Para outros terminais, como os conectados às portas seriais, não há como obter essas informações diretamente. Nesse caso, lesscomeça a procurar pistas nas variáveis ​​de ambiente.

  • LINESe COLUMNSgeralmente será definido para as dimensões do terminal. De fato, se bashou zshpuder encontrar as dimensões do terminal, ele definirá automaticamente essas variáveis ​​automaticamente, para facilitar para os programas não tão inteligentes ver o tamanho do terminal. No entanto, a maioria dos outros shells, incluindo dashe tcsh, não define essas variáveis.
  • TERMgeralmente é definido como o tipo de terminal; nesse caso, o banco de dados terminfo pode conter o tamanho esperado do terminal. Se tput rowsnão puder usar o IOCTL (por exemplo, se você estiver conectado por uma porta serial), ele retornará aos valores registrados aqui. Para um terminal cujo tamanho pode mudar, isso é apenas um palpite e provavelmente está errado.

Para obter mais informações, consulte man tputo comando para controlar o terminal e man terminfouma lista de coisas que você pode solicitar ao terminal.


O banco de dados terminfo não faz o que foi indicado aqui. A resposta de @ warl0ck, que contém menos informações, é mais precisa.
Thomas Dickey

@ThomasDickey Você está certo; tudo o que tem são valores esperados. Corrigida minha resposta; obrigado.
Jander

7

Se você der uma olhada no código fonte, conhecerá as lesschamadas ioctl()para recuperar o tamanho da janela no 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.