当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何找到终端窗口的宽度和高度?》经验,为你挑选了6个好方法。

举个简单的例子,我想写一个CLI脚本,可以在终端窗口的整个宽度上打印'='.

#!/usr/bin/env php


要么

#!/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信号)



1> TonyUser..:

tput cols 告诉你列数.

tput lines 告诉你行数.


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

2> David Dean..:

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


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

3> ryenus..:

而且stty,来自coreutils

$ stty size
60 120 # <= sample output

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

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

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


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

4> pixelbeat..:
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'


不是问题的直接答案,而是一个很棒的演示脚本.

5> 小智..:

要在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

6> LeoNerd..:

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

use Term::Size qw( chars );

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


POSIX标准中没有"TIOCGWINSZ",而"ioctl()"仅针对过时的STREAMS功能定义.
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有