簡単な例として=
、ターミナルウィンドウの幅全体に出力できる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
行数を示します。tput
端末の状態を読み取ったり、カーソルやテキストのプロパティを制御したりするためのたくさんのコマンドを備えた素晴らしいコマンドです。
alias dim="echo $(tput cols)x$(tput lines)"
、になる可能性があります80x50
。
alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
bashでは、$LINES
および$COLUMNS
環境変数がそのトリックを実行できるはずです。は、端末サイズが変更されると自動的に設定されます。(つまり、SIGWINCHシグナル)
checkwinsize
オプションを設定すると、非インタラクティブスクリプトで機能します。たとえば、この非対話型スクリプトは、それが実行される端末の寸法を出力します:(shopt -s checkwinsize; (:); echo $LINES $COLUMNS
このcheckwinsize
オプションは、サブシェルが完了するのを待った後でのみ変数を初期化するため、(:)
ステートメントが必要です)
$LINES
そして$COLUMNS
後に更新されSIGWINCH
、実際に任意の対話型コマンド実行後、送信されます。あなたは更新しようとした場合PS1
にtrap SIGWINCH
は、使用することはできません$LINES
と$COLUMNS
、彼らは古い値((キープ
LINES
また、bashによってCOLUMNS
のみシェル変数として設定されます。これらのシェル変数をエクスポートしない限り、Bashはそれらを環境変数として設定しません。
$ stty size
60 120 # <= sample output
行数と列数、または高さと幅をそれぞれ出力します。
次に、cut
またはawk
を使用して、必要な部分を抽出できます。
それstty size | cut -d" " -f1
は高さ/行とstty size | cut -d" " -f2
幅/列のためのものです
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
tr
年もの間、命令をどのようにして逃したのですか?(facepalm)
yes '='
無限の量の「=」行を出力し、次のコマンドは端末を埋めるのに十分な編成です
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;
}
お役に立てれば幸いです。
注:返される高さはバッファ内の行数であり、ウィンドウ内に表示される行数ではありません。そこにもっと良いオプションはありますか?
POSIXでは、最終的にはTIOCGWINSZ
(Get WINdow SiZe)ioctl()
呼び出しを呼び出す必要があります。ほとんどの言語はそのためのラッパーのようなものを持っているべきです。たとえばPerlでは、Term :: Sizeを使用できます。
use Term::Size qw( chars );
my ( $columns, $rows ) = chars \*STDOUT;
TIOCGWINSZ
POSIX標準にioctl()
はありません。廃止されたSTREAMS機能に対してのみ定義されます。
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'];
しかし、私はテストしなかったので、テストしてみてください。
---
行が表示されます。i.imgur.com/4x02dqT.png
$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
。それから、数字以外はすべて置き換えます。
CON device status:
どうなりますか?たぶんのようなものを一致させるCON.*:
ほうがうまくいきます。
行/ LINESと列が、使用されている「ターミナル」の実際のサイズと一致しない場合があります。おそらく、「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"
}