簡単な例として、ターミナルウィンドウの幅全体に「=」を印刷できる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;
}
私はそれが役に立つことを願っています!
NOTE:返される高さはバッファ内の行数であり、ウィンドウ内に表示される行数ではありません。より良いオプションはありますか?
POSIXでは、最終的にはTIOCGWINSZ
(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'];
私はそれをテストしなかったので、しかしそれをテストしてください。
@pixelbeatの回答に触発されて、ここにtput
、printf
のパディング/フィル、およびtr
のわずかな誤用によってもたらされた水平バーがあります。
printf "%0$(tput cols)d" 0|tr '0' '='
行/行および列が、使用されている「端末」の実際のサイズと一致しない場合があります。おそらく、「tput」または「stty」が利用できない可能性があります。
サイズを視覚的に確認するために使用できるbash関数を次に示します。これは、最大140列x 80行で機能します。必要に応じて最大値を調整できます。
function term_size
{
local i=0 digits='' tens_fmt='' tens_args=()
for i in {80..8}
do
echo $i $(( i - 2 ))
done
echo "If columns below wrap, LINES is first number in highest line above,"
echo "If truncated, LINES is second number."
for i in {1..14}
do
digits="${digits}1234567890"
tens_fmt="${tens_fmt}%10d"
tens_args=("${tens_args[@]}" $i)
done
printf "$tens_fmt\n" "${tens_args[@]}"
echo "$digits"
}