Wie kann ich die Breite und Höhe eines Terminal-Fenster finden?
-
06-07-2019 - |
Frage
Als einfaches Beispiel, ich mag einen CLI Skript schreiben, die ‚=‘ über die gesamte Breite des Terminalfensters drucken können.
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
oder
#!/usr/bin/env python
print '=' * ???
oder
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
Lösung
-
tput cols
sagt Ihnen, die Anzahl der Spalten. -
tput lines
sagt Ihnen, die Anzahl der Zeilen.
Andere Tipps
In der bash die $LINES
und $COLUMNS
Umgebungsvariablen sollten in der Lage sein, den Trick zu tun. Das wird in der Anschlussgröße automatisch bei jeder Änderung eingestellt werden. (Das heißt der SIGWINCH Signal)
Und es gibt stty
, von coreutils
$ stty size
60 120 # <= sample output
Es wird die Anzahl der Zeilen und Spalten, oder Höhe und Breite gedruckt ist.
Dann können Sie entweder cut
oder awk
verwenden, um den gewünschten Teil zu extrahieren.
Das ist stty size | cut -d" " -f1
für die Höhe / Linien und stty size | cut -d" " -f2
für die Breite / Spalten
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
diese in Windows CLI-Umgebung zu tun, ist die beste Weise, die ich finden kann, ist den Modus-Befehl zu verwenden und die Ausgabe zu analysieren.
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;
}
Ich hoffe, es ist nützlich!
Hinweis : Die Höhe zurück ist die Anzahl der Zeilen im Puffer, es ist nicht die Anzahl der Zeilen, die innerhalb des Fensters sichtbar sind. Irgendwelche bessere Möglichkeiten da draußen?
Auf POSIX, schließlich wollen Sie die TIOCGWINSZ
werden Aufrufen (Get Fenstergrße) ioctl()
Anruf. Die meisten Sprachen sollte dafür eine Art Wrapper haben. Z. B in Perl können Sie Term :: Größe verwenden:
use Term::Size qw( chars );
my ( $columns, $rows ) = chars \*STDOUT;
Wie ich in Lyceus Antwort erwähnt, seinen Code auf nicht-englischen Gebietsschema von Windows fehlschlagen, da dann die Ausgabe von mode
nicht die Teilstrings „Spalten“ oder „Linien“ enthalten:
Sie können die korrekte Teilzeichenfolge Mehrmusiksprachig für Text:
preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
$cols = $matches['cols'];
Beachten Sie, dass ich nicht einmal mit Linien stört, weil es unzuverlässig ist (und ich über sie eigentlich nicht kümmern).
Edit: Nach Kommentaren über Windows 8 (oh man ...), ich glaube, das zuverlässiger sein kann:
preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
$cols = $matches['cols'];
Sie es aber testen, weil ich es nicht getestet.
Inspiriert von @ pixelbeat Antwort, hier ist eine horizontale Leiste auf Existenz von tput
gebracht, leichtem Missbrauch von printf
padding / Abfüll- und tr
printf "%0$(tput cols)d" 0|tr '0' '='
Es gibt einige Fälle, in denen Sie Ihre Reihen / Zeilen und Spalten entsprechen nicht die tatsächliche Größe des „Terminal“ verwendet wird. Vielleicht können Sie nicht ein „tput“ oder „stty“ zur Verfügung.
Hier ist eine bash Funktion, die Sie visuell die Größe überprüfen können. Dies wird bis zu 140 Spalten x 80 Zeilen arbeiten. Sie können die Maxima nach Bedarf anpassen.
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"
}