举个简单的例子,我想写一个CLI脚本,可以在终端窗口的整个宽度上打印'='.
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
Run Code Online (Sandbox Code Playgroud)
要么
#!/usr/bin/env python
print '=' * ???
Run Code Online (Sandbox Code Playgroud)
要么
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
Run Code Online (Sandbox Code Playgroud)
Ton*_*ser 514
tput cols
告诉你列数.tput lines
告诉你行数.Dav*_*ean 95
在bash中,$LINES
和$COLUMNS
环境变量应该可以做的伎俩.将在终端大小发生任何变化时自动设置.(即SIGWINCH信号)
rye*_*nus 58
$ stty size
60 120 # <= sample output
Run Code Online (Sandbox Code Playgroud)
它将分别打印行数和列数,或高度和宽度.
然后,你可以使用cut
或awk
提取出需要的部分.
这是stty size | cut -d" " -f1
高度/线和stty size | cut -d" " -f2
宽度/列
pix*_*eat 15
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
Run Code Online (Sandbox Code Playgroud)
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
我希望它有用!
注意:返回的高度是缓冲区中的行数,它不是窗口中可见的行数.还有更好的选择吗?
Leo*_*erd 10
在POSIX上,最终你想要调用TIOCGWINSZ
(Get WINdow SiZe)ioctl()
调用.大多数语言都应该有某种包装.例如在Perl中你可以使用Term :: Size:
use Term::Size qw( chars );
my ( $columns, $rows ) = chars \*STDOUT;
Run Code Online (Sandbox Code Playgroud)