Da diese Frage sehr beliebt ist, möchte ich eine neuere Antwort mit einigen zusätzlichen Informationen hinzufügen.
In modernen Systemen sind die Variablen $COLUMNS
und häufig keine Umgebungsvariablen. Die Shell setzt diese Werte nach jedem Befehl dynamisch und wir können normalerweise nicht über nicht interaktive Skripte darauf zugreifen. Einige Programme respektieren diese Werte, wenn wir sie exportieren , aber dieses Verhalten ist nicht standardisiert oder wird nicht allgemein unterstützt.$LINES
Bash setzt diese Variablen im Rahmen des Prozesses (nicht der Umgebung), wenn wir die checkwinsize
Option aktivieren, indem wir :
shopt -s checkwinsize
Viele Systeme aktivieren diese Option für uns in einer Standard- oder systemweiten Startdatei ( / etc / bashrc oder ähnlichem). Daher müssen wir uns daran erinnern, dass diese Variablen möglicherweise nicht immer verfügbar sind. Auf einigen Systemen, wie z. B. Cygwin, ist diese Option für uns nicht aktiviert, sodass Bash nicht festgelegt wird $COLUMNS
und es $LINES
sei denn, wir führen die obige Zeile aus oder fügen sie unserem ~ / .bashrc hinzu .
Tragbare Ansätze
Beim Schreiben nicht interaktiver Skripte möchten wir uns normalerweise nicht auf $LINES
und $COLUMNS
standardmäßig verlassen (wir können diese jedoch überprüfen, damit ein Benutzer die Terminalgröße bei Bedarf manuell überschreiben kann).
Stattdessen wird die stty
und tput
bieten Dienstprogramme tragbare Mittel , um die Klemmengröße von einem Skript , um zu bestimmen (die Befehle sind nachstehend beschrieben derzeit Standardisierung für POSIX unterziehen ).
Wie in der akzeptierten Antwort von Puppe gezeigt , können wir tput
die Terminalgröße auf ziemlich einfache Weise erfassen:
lines=$(tput lines)
columns=$(tput cols)
Alternativ gibt die size
Abfrage für stty
die Anzahl der Terminalzeilen und -spalten in einem Schritt an (Ausgabe als Anzahl der Zeilen, gefolgt von zwei Leerzeichen, gefolgt von der Anzahl der Spalten):
size=$(stty size)
Das stty
Programm wird normalerweise mit GNU Coreutils ausgeliefert , sodass wir es häufig auf Systemen ohne finden können tput
. Ich bevorzuge manchmal den stty
Ansatz, weil wir einen Befehl und eine Unterschale weniger aufrufen (teuer bei Cygwin), aber es erfordert, dass wir die Ausgabe in Zeilen und Spalten analysieren, die möglicherweise weniger lesbar sind:
lines=${size% *}
columns=${size#* }
Beide oben beschriebenen Ansätze funktionieren in jeder POSIX-Shell.
Nicht tragbare Ansätze
Wenn uns die Portabilität egal ist, unterstützt Bash die Prozessersetzung , um das vorherige Beispiel zu vereinfachen:
read lines columns < <(stty size)
... was schneller läuft als das tput
Beispiel, aber immer noch langsamer als die erste stty
Implementierung, zumindest auf meinem Computer. In der Praxis ist die Auswirkung auf die Leistung wahrscheinlich vernachlässigbar. Wählen Sie den Ansatz, der für das Programm am besten geeignet ist (oder basierend darauf, welcher Befehl auf dem Zielsystem verfügbar ist).
Für Bash- Versionen 4.3 und höher können wir die checkwinsize
Option nutzen, um eine Abhängigkeit von einem anderen Programm zu vermeiden. Wenn wir diese Option in einem Skript zu aktivieren, wird eingestellt Bash $LINES
und $COLUMNS
wie es funktioniert für eine interaktive Eingabeaufforderung nach einem Kind Prozess beendet:
#!/bin/bash
shopt -s checkwinsize
cat /dev/null
... wie wenn eine Unterschale beendet wird:
shopt -s checkwinsize
(: Refresh LINES and COLUMNS)
Bash ruft die Terminalgröße nach jedem Aufruf eines externen Befehls ab, wenn wir diese Option aktivieren. Daher möchten wir sie möglicherweise nach dem Initialisieren der Variablen wieder deaktivieren:
shopt -u checkwinsize
Wenn wir aus irgendeinem Grund weiterhin $LINES
und $COLUMNS
aus der Umgebung in unseren Skripten verwenden möchten , können wir Bash so konfigurieren, dass diese Variablen in die Umgebung exportiert werden:
trap 'export LINES COLUMNS' DEBUG
Der Bash- DEBUG
Trap wird vor jedem an der Eingabeaufforderung eingegebenen Befehl ausgeführt, sodass wir ihn zum Exportieren dieser Variablen verwenden können. Durch erneutes Exportieren mit jedem Befehl stellen wir sicher, dass die Umgebungsvariablen auf dem neuesten Stand bleiben, wenn sich die Terminalgröße ändert. Fügen Sie diese Zeile zusammen mit der oben gezeigten Option zu .bashrc hinzucheckwinsize
. Es funktioniert gut für persönliche Skripte, aber ich empfehle nicht, diese Variablen in Skripten zu verwenden, die gemeinsam genutzt werden.