端末の解像度をどうやって知ることができますか?

端末の解像度をどうやって知ることができますか?

誰かが仮想コンソールに異なるサイズを設定するたびにlessウィンドウの解像度を認識します(おそらく...)。これに基づいて、可視化する必要があるテキスト行の数が変更されます。このパラメータはどのように計算されますか?

ベストアンサー1

スクリプトで確認する方法を探している場合は、次のいずれかを実行できます。

  • manatworkの提案に従って実行しますtput colstput 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 colsTIOCGWINSZを参照して検索してください。tput linesman tty-ioctl

ただし、シリアルポートに接続されている端末などの他の端末では、この情報を直接取得することはできません。その場合は、less環境変数で手がかりを探し始めます。

  • LINES通常はCOLUMNS端子サイズに設定されます。実際には、ターミナル寸法が見つかるbashzsh見つからない場合は、これらの変数自体を自動的に設定して、あまり賢明ではないプログラムがターミナル寸法を簡単に表示できます。ただし、他のほとんどのシェル(dashおよび含むtcsh)はこれらの変数を設定しません。
  • TERM通常は端末タイプに設定されます。この場合、terminfo データベースには端末の予想サイズを含めることができます。 IOCTLが利用できない場合tput rows(たとえば、シリアルポートを介して接続する場合)、ここで説明されている値に置き換えられます。寸法が変更される可能性がある端末の場合、これは推測にすぎず、間違っている可能性があります。

詳細については、man tput端末制御コマンドとman terminfo端末に指示できるタスクのリストを参照してください。

おすすめ記事