誰かが仮想コンソールに異なるサイズを設定するたびに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
端末に指示できるタスクのリストを参照してください。