举个简单的例子,我想写一个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它将分别打印行数和列数,或高度和宽度.
然后,你可以使用
cut
或awk
提取出需要的部分.这是
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功能定义.