Jedes Mal, wenn jemand eine andere Größe für eine virtuelle Konsole einstellt, less
erkennt er die Fensterauflösung (das nehme ich an ...); dementsprechend ändert sich, wie viele Textzeilen angezeigt werden sollen. Wie wird dieser Parameter berechnet?
Antwort1
Wenn Sie nach einer Möglichkeit suchen, die Prüfung über ein Skript durchzuführen, haben Sie folgende Möglichkeiten:
- Führen Sie
tput cols
und austput lines
, wie manatwork vorschlägt - Überprüfen Sie die Werte von $LINES und $COLUMNS
Aber wenn Sie die Einzelheiten wissen möchten, hier sind sie:
Für virtuelle Terminals (xterm usw.) gibt es einen ioctl()
Systemaufruf, der Ihnen die Fenstergröße mitteilt. Wenn möglich, less
wird dieser Aufruf verwendet. Wenn Sie die Fenstergröße ändern, erhält außerdem alles, was in diesem Fenster ausgeführt wird, ein SIGWINCH
Signal, das Sie darüber less
informiert, dass es nach einer neuen Fenstergröße suchen soll. Ich habe beispielsweise einen less
laufenden gestartet (mit der Prozess-ID 16663), mich mit ihm verbunden strace
und die Fenstergröße geändert. Das ist, was ich gesehen habe:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
Dies ist auch das, was tput cols
sie tput lines
hinter den Kulissen tun, wenn sie können. Weitere Informationen zu dieser Methode finden Sie unter man tty-ioctl
TIOCGWINSZ. Suchen Sie dort nach TIOCGWINSZ.
Bei anderen Terminals, beispielsweise solchen, die an serielle Schnittstellen angeschlossen sind, gibt es jedoch keine Möglichkeit, diese Informationen direkt abzurufen. In diesem Fall less
beginnt man mit der Suche nach Hinweisen in den Umgebungsvariablen.
LINES
undCOLUMNS
wird oft auf die Terminalabmessungen eingestellt. Wennbash
oderzsh
die Terminalabmessungen ermitteln kann, werden diese Variablen automatisch selbst eingestellt, damit auch weniger clevere Programme die Terminalgröße leicht erkennen können. Die meisten anderen Shells, einschließlichdash
undtcsh
, setzen diese Variablen jedoch nicht.TERM
wird normalerweise auf den Terminaltyp eingestellt. In diesem Fall kann die Terminfo-Datenbank die erwartete Größe des Terminals enthalten. Wenntput rows
IOCTL nicht verwendet werden kann (beispielsweise wenn Sie über einen seriellen Port verbunden sind), wird auf die hier aufgezeichneten Werte zurückgegriffen. Bei einem Terminal, dessen Größe sich ändern kann, ist dies nur eine Schätzung und wahrscheinlich falsch.
Weitere Informationen finden Sie man tput
unter Befehl zur Steuerung des Terminals und man terminfo
unter einer Liste der Befehle, die Sie dem Terminal erteilen können.
Antwort2
Wenn Sie einen Blick auf den Quellcode werfen, werden Sie less
Aufrufe ioctl()
zum Abrufen der Fenstergröße unter Linux kennen.
#ifdef TIOCGWINSZ
{
struct winsize w;
if (ioctl(2, TIOCGWINSZ, &w) == 0)
{
if (w.ws_row > 0)
sys_height = w.ws_row;
if (w.ws_col > 0)
sys_width = w.ws_col;
}
}
#else
#ifdef WIOCGETD
{
struct uwdata w;
if (ioctl(2, WIOCGETD, &w) == 0)
{
if (w.uw_height > 0)
sys_height = w.uw_height / w.uw_vs;
if (w.uw_width > 0)
sys_width = w.uw_width / w.uw_hs;
}
}
#endif
Antwort3
Ich bin nicht sicher, ob dies die Informationen sind, nach denen Sie suchen. Ich vermute, es less
registriert einen Signalhandler für SIGWINCH
. Wenn sich die Dimension des Terminals ändert, erhält es ein SIGWINCH
Signal und prüft die TTY-Informationen für die aktuelle Dimension des Terminals.
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html