我如何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
它将分别打印行数和列数,或者高度和宽度。
然后你可以使用cut
或awk
来提取你想要的部分。
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它。