如何找到终端窗口的宽度和高度?

too much php 272 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

TonyUser.. 514

  • tput cols 告诉你列数.
  • tput lines 告诉你行数.

  • `echo -e"lines \ncols"| tput -S`以获取行和列:http://linux.about.com/library/cmd/blcmdl1_tput.htm (10认同)
  • `tput`是一个很棒的命令,有很多命令(http://stackoverflow.com/a/20983251/24874),用于读取终端的状态,控制光标和文本属性等等. (3认同)
  • 方便的别名,例如:`alias dim ="echo $(tput cols)x $(tput lines)"`,这可能会导致`80x50`. (2认同)
  • 此Q&A*可能*属于unix或超级用户SE网站. (2认同)
  • 当外壳程序被获取时,@ bishop您提供的alias命令将得到评估。您需要对alias命令使用单引号。像这样:`alias dim ='echo终端尺寸:$(tput cols)列x $(tput行)行” (2认同)

David Dean.. 95

在bash中,$LINES$COLUMNS环境变量应该可以做的伎俩.将在终端大小发生任何变化时自动设置.(即SIGWINCH信号)

  • 但是,这些环境变量仅适用于bash,而不适用于在bash内运行的任何程序(如perl,python,ruby). (17认同)
  • 除了交互式bash会话之外,这不起作用(如果你运行脚本它不再是交互式的).您可以在脚本中使用它的唯一地方是bash中的prompt_command. (9认同)

ryenus.. 58

而且stty,来自coreutils

$ stty size
60 120 # <= sample output

它将分别打印行数和列数,或高度和宽度.

然后,你可以使用cutawk提取出需要的部分.

这是stty size | cut -d" " -f1高度/线和stty size | cut -d" " -f2宽度/列

  • tput的问题在于,当stty在每个tty中可用时,它并不总是可用的.谢谢你的信息! (6认同)

pixelbeat.. 15

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

  • 不是问题的直接答案,而是一个很棒的演示脚本. (3认同)

小智.. 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;
}

我希望它有用!

注意:返回的高度是缓冲区中的行数,它不是窗口中可见的行数.还有更好的选择吗?

  • 请注意这个问题:此命令的输出是特定于语言环境的.换句话说,这不会在另一个Windows语言环境中按原样运行.这就是我在Windows 7上获得的:http://i.imgur.com/Wrr7sWY.png (3认同)

LeoNerd.. 10

在POSIX上,最终你想要调用TIOCGWINSZ(Get WINdow SiZe)ioctl()调用.大多数语言都应该有某种包装.例如在Perl中你可以使用Term :: Size:

use Term::Size qw( chars );

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

  • POSIX标准中没有"TIOCGWINSZ",而"ioctl()"仅针对过时的STREAMS功能定义. (2认同)