[terminal] 터미널 창의 너비와 높이는 어떻게 찾습니까?

간단한 예로 =터미널 창의 전체 너비에 걸쳐 인쇄 할 수있는 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



답변

  • tput cols 열 수를 알려줍니다.
  • tput lines 행 수를 알려줍니다.

답변

배쉬에서 $LINES$COLUMNS환경 변수 트릭을 할 수 있어야합니다. 터미널 크기가 변경되면 자동으로 설정됩니다. (즉, SIGWINCH 신호)


답변

그리고 거기 stty에서, 로 coreutils

$ stty size
60 120 # <= sample output

행과 열의 수 또는 높이와 너비를 각각 인쇄합니다.

그럼 당신은 사용할 수 있습니다 cut또는 awk당신이 원하는 부분을 추출 할 수 있습니다.

그것은 stty size | cut -d" " -f1높이 / 라인과 stty size | cut -d" " -f2너비 / 열을위한 것입니다.


답변

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


답변

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

도움이 되길 바랍니다.

참고 : 반환 된 높이는 버퍼의 줄 수이며 창에 표시되는 줄 수는 아닙니다. 더 나은 옵션이 있습니까?


답변

POSIX에서는 궁극적으로 TIOCGWINSZ(Get WINdow SiZe) ioctl()호출을 호출 하려고 합니다. 대부분의 언어에는 일종의 래퍼가 있어야합니다. 예를 들어 Perl에서는 Term :: Size를 사용할 수 있습니다 .

use Term::Size qw( chars );

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


답변

내가 lyceus answer에서 언급했듯이, 영어가 아닌 로케일 Windows에서는 그의 출력에 mode하위 문자열 “columns”또는 “lines”가 포함되지 않을 수 있기 때문에 코드가 실패합니다 .

                                         모드 명령 출력

텍스트를 찾지 않고 올바른 하위 문자열을 찾을 수 있습니다.

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

신뢰할 수 없기 때문에 줄을 귀찮게하지 않습니다 (실제로 신경 쓰지 않습니다).

편집하다: Windows 8 (oh you …)에 대한 의견에 따르면 이것이 더 신뢰할 수 있다고 생각합니다.

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

테스트하지 않았으므로 테스트 해보십시오.