355

=簡単な例として、ターミナル ウィンドウの幅全体に印刷できる 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
4

10 に答える 10

663
  • tput cols列の数を示します。
  • tput lines行数を教えてくれます。
于 2008-11-04T23:40:49.717 に答える
124

bashでは、$LINESおよび$COLUMNS環境変数がそのトリックを実行できるはずです。端子サイズを変更すると自動的に設定されます。(つまり、SIGWINCH信号)

于 2009-02-19T01:30:49.907 に答える
21
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
于 2008-11-04T23:50:03.893 に答える
12

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;
}

役に立つことを願っています!

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

于 2011-09-27T20:08:51.243 に答える
11

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

use Term::Size qw( chars );

my ( $columns, $rows ) = chars \*STDOUT;
于 2012-04-10T00:39:56.727 に答える
4

lyceus の回答で述べたように、彼のコードは英語以外のロケールの Windows では失敗します。これは、の出力にmode部分文字列「columns」または「lines」が含まれない可能性があるためです。

                                         モード コマンド出力

テキストを探すことなく、正しい部分文字列を見つけることができます。

 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'];

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

于 2014-01-17T15:53:06.947 に答える