web-dev-qa-db-ja.com

ターミナルウィンドウの幅と高さを確認するにはどうすればよいですか?

簡単な例として、ターミナルウィンドウの幅全体に「=」を印刷できるCLIスクリプトを作成します。

#!/usr/bin/env php
<?php
echo str_repeat('=', ???);

または

#!/usr/bin/env python
print '=' * ???

または

#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
257
too much php
  • tput colsは列の数を示します。
  • tput linesは行数を示します。
481
TonyUser

Bashでは、$LINESおよび$COLUMNS環境変数がこのトリックを実行できるはずです。は、端末サイズが変更されると自動的に設定されます。 (つまり SIGWINCH シグナル)

87
David Dean

そして、 stty があります- coreutils から

$ stty size
60 120 # <= sample output

行と列の数、または高さと幅をそれぞれ印刷します。

その後、cutまたはawkのいずれかを使用して、必要な部分を抽出できます。

それは高さ/行のstty size | cut -d" " -f1と幅/列のstty size | cut -d" " -f2です

56
ryenus
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
15
pixelbeat

Windows CLI環境でこれを行うには、modeコマンドを使用して出力を解析するのが最良の方法です。

function getTerminalSizeOnWindows() {
  $output = array();
  $size = array('width'=>0,'height'=>0);
  exec('mode',$output);
  foreach($output as $line) {
    $matches = array();
    $w = preg_match('/^\s*columns\:?\s*(\d+)\s*$/i',$line,$matches);
    if($w) {
      $size['width'] = intval($matches[1]);
    } else {
      $h = preg_match('/^\s*lines\:?\s*(\d+)\s*$/i',$line,$matches);
      if($h) {
        $size['height'] = intval($matches[1]);
      }
    }
    if($size['width'] AND $size['height']) {
      break;
    }
  }
  return $size;
}

私はそれが役に立つことを願っています!

NOTE:返される高さはバッファ内の行数であり、ウィンドウ内に表示される行数ではありません。より良いオプションはありますか?

12
lyceus

POSIXでは、最終的にはTIOCGWINSZ(Get WINdow SiZe)ioctl()呼び出しを呼び出します。ほとんどの言語には、そのための何らかのラッパーが必要です。たとえば、Perlでは Term :: Size :を使用できます

use Term::Size qw( chars );

my ( $columns, $rows ) = chars \*STDOUT;
9
LeoNerd

Lyceusの回答で述べたように、英語以外のロケールWindowsでは、modeの出力にサブストリング "columns"または "lines"が含まれない可能性があるため、彼のコードは失敗します。

mode command output

テキストを探すことなく正しいサブストリングを見つけることができます。

 preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

信頼性がないので、私は線でさえ気にしないことに注意してください(そして、私は実際にそれらを気にしません)。

編集: Windows 8についてのコメント(おっと...)によると、これはより信頼性が高いと思います。

 preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

私はそれをテストしなかったので、しかしそれをテストしてください。

4
Camilo Martin

@pixelbeatの回答に触発されて、ここにtputprintfのパディング/フィル、およびtrのわずかな誤用によってもたらされた水平バーがあります。

printf "%0$(tput cols)d" 0|tr '0' '='
1
huoneusto

行/行および列が、使用されている「端末」の実際のサイズと一致しない場合があります。おそらく、「tput」または「stty」が利用できない可能性があります。

サイズを視覚的に確認するために使用できるbash関数を次に示します。これは、最大140列x 80行で機能します。必要に応じて最大値を調整できます。

function term_size
{
    local i=0 digits='' tens_fmt='' tens_args=()
    for i in {80..8}
    do
        echo $i $(( i - 2 ))
    done
    echo "If columns below wrap, LINES is first number in highest line above,"
    echo "If truncated, LINES is second number."
    for i in {1..14}
    do
        digits="${digits}1234567890"
        tens_fmt="${tens_fmt}%10d"
        tens_args=("${tens_args[@]}" $i)
    done
    printf "$tens_fmt\n" "${tens_args[@]}"
    echo "$digits"
}
0
pourhaus