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
War es hilfreich?

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:

Modus Befehlsausgabe

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"
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top