=
簡単な例として、ターミナル ウィンドウの幅全体に印刷できる CLI スクリプトを書きたいと思います。
#!/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
=
簡単な例として、ターミナル ウィンドウの幅全体に印刷できる CLI スクリプトを書きたいと思います。
#!/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
環境変数がそのトリックを実行できるはずです。端子サイズを変更すると自動的に設定されます。(つまり、SIGWINCH信号)
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
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;
}
役に立つことを願っています!
注: 返される高さはバッファ内の行数であり、ウィンドウ内に表示される行数ではありません。より良いオプションはありますか?
TIOCGWINSZ
POSIX では、最終的には(Get WINdow Size)呼び出しを呼び出したいと考えていioctl()
ます。ほとんどの言語には、そのための何らかのラッパーが必要です。たとえば、Perl ではTerm::Sizeを使用できます。
use Term::Size qw( chars );
my ( $columns, $rows ) = chars \*STDOUT;
lyceus の回答で述べたように、彼のコードは英語以外のロケールの Windows では失敗します。これは、の出力にmode
部分文字列「columns」または「lines」が含まれない可能性があるためです。
テキストを探すことなく、正しい部分文字列を見つけることができます。
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'];
私はそれをテストしていないので、それをテストしてください。