我如何findterminal窗口的宽度和高度?

作为一个简单的例子,我想写一个CLI脚本,可以在terminal窗口的整个宽度上打印“=”。

#!/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告诉你行数。

在bash中, $LINES$COLUMNS环境variables应该能够做到这一点。 在terminal尺寸发生变化时将自动设置。 (即SIGWINCH信号)

而且从coreutils来说还有stty

 $ stty size 60 120 # <= sample output 

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

然后你可以使用cutawk来提取你想要的部分。

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

在POSIX上,最终你要调用TIOCGWINSZ (Get WINdow SiZe) ioctl()调用。 大多数语言应该有这样的包装。 例如在Perl中,您可以使用Term :: Size :

 use Term::Size qw( chars ); my ( $columns, $rows ) = chars \*STDOUT; 

要在Windows CLI环境中执行此操作,我可以find的最好方法是使用mode命令并parsing输出。

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

我希望这是有用的!

:返回的高度是缓冲区中的行数,而不是在窗口内可见的行数。 有更好的select吗?

正如我在lyceus回答中所提到的,他的代码将在非英文语言环境的Windows上失败,因为那么mode的输出可能不包含子列“columns”或“lines”:

模式命令输出

您可以在不查找文本的情况下find正确的子string:

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

尽pipe如此,因为我没有testing它。

Interesting Posts