누군가 가상 콘솔에 대해 다른 크기를 설정할 때마다 less
창 해상도를 인식합니다(아마도...). 이를 기반으로 시각화해야 하는 텍스트 줄 수가 변경됩니다. 이 매개변수는 어떻게 계산되나요?
답변1
스크립트에서 확인하는 방법을 찾고 있다면 다음 중 하나를 수행할 수 있습니다.
- manatwork의 제안에 따라 실행
tput cols
하고tput lines
- $LINES, $COLUMNS 값을 확인해보세요.
하지만 자세한 내용을 알고 싶다면 다음을 참조하세요.
ioctl()
가상 터미널(xterm 등)의 경우 창 크기를 알려주는 시스템 호출이 있습니다 . 가능하다면 less
이 호출을 사용하세요. 또한 창 크기를 변경하면 해당 창에서 실행 중인 모든 프로그램은 새 창 크기를 확인해야 한다는 SIGWINCH
신호를 받습니다. less
예를 들어, 실행 중인 프로세스(프로세스 ID 16663)를 시작하고 less
를 사용하여 연결 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
TIOCGWINSZ를 참조하고 검색하세요.tput lines
man tty-ioctl
그러나 직렬 포트에 연결된 터미널과 같은 다른 터미널의 경우 이 정보를 직접 얻을 수 없습니다. 이 경우 less
환경 변수에서 단서를 찾기 시작하세요.
LINES
일반적 으로COLUMNS
터미널 크기로 설정됩니다. 실제로 터미널 치수를 찾bash
거나zsh
찾을 수 있으면 덜 영리한 프로그램이 터미널 치수를 쉽게 볼 수 있도록 이러한 변수 자체를 자동으로 설정합니다. 그러나 대부분의 다른 쉘(dash
및 포함tcsh
)에서는 이러한 변수를 설정하지 않습니다.TERM
일반적으로 터미널 유형으로 설정됩니다. 이 경우 terminfo 데이터베이스에는 터미널의 예상 크기가 포함될 수 있습니다. IOCTL을 사용할 수 없는 경우tput rows
(예: 직렬 포트를 통해 연결하는 경우) 여기에 설명된 값으로 대체됩니다. 치수가 변경될 수 있는 터미널의 경우 이는 단지 추측일 뿐이며 틀릴 가능성이 높습니다.
자세한 내용은 man tput
터미널 제어 명령 및 man terminfo
터미널에 지시할 수 있는 작업 목록을 참조하세요.
답변2
소스 코드를 보면 Linux에서 창 크기를 검색하는 호출을 알 수 있습니다 less
.ioctl()
#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
답변3
이것이 귀하가 찾고 있는 정보인지 확실하지 않습니다. less
신호 처리기가 등록된 것 같습니다 SIGWINCH
. 터미널 크기가 변경되면 SIGWINCH
신호를 수신하고 터미널의 현재 크기에 대한 tty 정보를 감지합니다.
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html