Cada vez que alguém define um tamanho diferente para um console virtual, less
reconhece a resolução da janela (presumo que...); de acordo com isso, altera quantas linhas de texto deve visualizar. Como esse parâmetro é calculado?
Responder1
Se você está procurando uma maneira de verificar um script, você pode fazer um destes:
- Execute
tput cols
etput lines
, como sugere manatwork - verifique os valores de $LINES e $COLUMNS
Mas se você quiser os detalhes, aqui vamos nós:
Para terminais virtuais (xterm, et al), existe uma ioctl()
chamada de sistema que informa o tamanho da janela. Se puder, less
use esta chamada. Além disso, quando você altera o tamanho da janela, tudo o que está sendo executado naquela janela recebe um SIGWINCH
sinal informando less
que deve verificar um novo tamanho de janela. Por exemplo, iniciei uma less
execução (como ID do processo 16663), conectei-me a ela com strace
e 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 cols
eles tput lines
fazem nos bastidores, se puderem. Para obter mais informações sobre esse método, consulte man tty-ioctl
e pesquise TIOCGWINSZ.
Para outros terminais, como aqueles conectados a portas seriais, não há como obter essas informações diretamente. Nesse caso, less
começa a procurar pistas nas variáveis de ambiente.
LINES
eCOLUMNS
muitas vezes será definido para as dimensões do terminal. Na verdade, sebash
conseguirzsh
encontrar as dimensões do terminal, ele próprio definirá automaticamente essas variáveis, para tornar mais fácil para programas não tão inteligentes verem o tamanho do terminal. No entanto, a maioria dos outros shells, incluindodash
etcsh
, não definem essas variáveis.TERM
geralmente é definido como o tipo de terminal; nesse caso, o banco de dados terminfo pode conter o tamanho esperado do terminal. Setput rows
não for possível 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 uma suposição e provavelmente está errado.
Para obter mais informações, consulte man tput
o comando para controlar o terminal e man terminfo
uma lista de coisas que você pode instruir o terminal a fazer.
Responder2
Se você der uma olhada no código-fonte, conhecerá less
as chamadas 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
Responder3
Não tenho certeza se esta é a informação que você está procurando. Eu acho que less
registra um manipulador de sinal para SIGWINCH
. Quando a dimensão do terminal muda, ele recebe um SIGWINCH
sinal e testa as informações tty para a dimensão atual do terminal.
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html