Ich stoße auf ein Problem, bei dem ich versuche, mithilfe von Skripten die Größe eines Terminals zu ermitteln. Normalerweise würde ich den Befehl tput cols
in der Konsole verwenden, aber ich möchte in der Lage sein, diese Funktion durch strikte Verwendung von Skripten zu erreichen.
Ab sofort kann ich die laufende Konsole erkennen und deren Dateipfad ermitteln. Ich bemühe mich jedoch, diese Informationen zu verwenden, um die Breite der Konsole zu ermitteln. Ich habe versucht, den Befehl zu verwenden tput
, aber ich bin ziemlich neu in Linux / Skripten, daher weiß ich nicht wirklich, was ich tun soll.
Der Grund dafür ist, dass ich in der Lage sein möchte, einen Cron- Eintrag einzurichten, der die Konsole von Zeit zu Zeit über seine Breite / Spalten benachrichtigt.
Das ist mein Code bisher:
tty.sh
#!/bin/bash
#Get PID of terminal
#terminal.txt holds most recent PID of console in use
value=$(</home/test/Documents/terminal.txt)
#Get tty using the PID from terminal.txt
TERMINAL="$(ps h -p $value -o tty)"
echo $TERMINAL
#Use tty to get full filepath for terminal in use
TERMINALPATH=/dev/$TERMINAL
echo $TERMINALPATH
COLUMNS=$(/home/test/Documents/get_columns.sh)
echo $COLUMNS
get_columns.sh
#!/usr/bin/env bash
echo $(/usr/bin/tput cols)
Die normale Ausgabe von TERMINAL
& TERMINALPATH
ist und zum Beispiel &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
quelle
cron
Jobs Kontrollterminals haben.Antworten:
Der
tput
Befehl ist ein ausgezeichnetes Werkzeug, kann jedoch leider nicht die tatsächlichen Einstellungen für ein beliebig ausgewähltes Terminal abrufen.Der Grund dafür ist, dass es stdout für die Terminal-Eigenschaften liest und hier auch seine Antwort schreibt. In dem Moment, in dem Sie versuchen, die Ausgabe von zu erfassen
tput cols
, haben Sie auch die Informationsquelle entfernt.Zum Glück
stty
liest stdin anstelle von stdout, um die Eigenschaften des Terminals zu bestimmen. So können Sie die benötigten Größeninformationen abrufen:Übrigens ist es unnötig umständlich, dies so zu schreiben
echo $(/usr/bin/tput cols)
.Für jedes Konstrukt führen
echo $(some_command)
Sie diesome_command
Ausgabe aus und erfassen sie, die Sie dann anecho
die Ausgabe übergeben. In fast jeder Situation können Sie sich vorstellen, dass Sie genauso gut einfach ausgeführt habensome_command
und die Ausgabe direkt liefern lassen. Es ist effizienter und auch leichter zu lesen.quelle
tput
/nurses
? Mine (ncurses 6.0.20160625) führt das TIOCGWINSZ auf stderr aus, wenn es auf stdout nicht möglich ist.cols=$(tput cols)
odercols=$(tput cols 2<> /dev/ttyx)
funktioniert gut.ncurses 5.7.20100313
hier. Sind Sie sicher,cols=$(tput cols 2<> /dev/tty1)
dass es bei Ihnen nicht funktioniert?tput cols
liest stderr . Ich muss jetzt herausfinden, wie ich meine Antwort umschreiben kann ...stty size <"$terminal" | read rows columns
anstatt zu versuchen, zu analysierenstty -a
tput cols
undtput lines
fragen Sie die Größe des Terminals (vom Terminalgerätetreiber, nicht vom Terminal selbst) vom Terminalgerät auf seiner Standardausgabe ab, und wenn die Standardausgabe kein Terminalgerät ist, wie im Fall,cols=$(tput cols)
dass es sich dann um eine Pipe handelt, von stderr.Um die Werte von einem beliebigen Endgerät abzurufen, müssen Sie dieses Gerät auf dem folgenden Verzeichnis öffnen
tput
:(hier schreibgeschützt geöffnet, daher werden
tput
dort keine Fehlermeldungen ausgegeben).Alternativ können Sie möglicherweise verwenden
stty size
.stty
fragt das Terminal nach stdin ab:Keines davon ist Standard und funktioniert möglicherweise (und in der Praxis) nicht auf allen Systemen. Es sollte jedoch ziemlich portabel für GNU / Linux-Systeme sein.
Das Hinzufügen
stty size
oder eine andere Methode zum Abfragen der Terminalgröße wurde an POSIX angefordert, aber die Diskussion scheint nirgendwo hin zu führen.quelle
Dieses Skript:
Hier hat mit absolut nix mehr gearbeitet .....
Warum setzen Sie eine Umgebungsvariable mit Daten? COLUMNS = $ (/ home / test / Documents / get_columns.sh)
Versuchen Sie, die Spalten und Zeilen aus einem anderen Skript oder tty abzurufen? Ist es das? Für mich immer noch seltsam, weil Sie die Umgebungsvariable columns für das lokale Skript festlegen ....
quelle
cron
Auftrags für ein bestimmtes Terminal abzurufen .cron
Job fragt ein bestimmtes Terminal nach seinen Eigenschaften ab. (Ich bin nicht ganz sicher, warum es das tun muss, aber das ist, was die OP will.)Meine Antwort ist anders als die von Roaima, da sie dynamisch ist. Seine / Ihre Antwort gibt Ihnen die Größe des Terminals bei der Erstellung. Wenn Sie beispielsweise einen Kachelfenster-Manager wie i3 oder bspwm verwenden, möchten Sie lieber die aktuelle Breite des Terminals haben. Also benutze ich ssty aus dem Paket coreutils:
Lucianos Lösung funktioniert einwandfrei in xterm und xfce4-terminal. Ich weiß nicht, ob alle Terminals die Variable $ COLUMNS setzen.
quelle