BASH - Information in einer Ecke einer TTY Schreiben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

BASH - Information in einer Ecke einer TTY Schreiben

Beitrag von K.I.T.T. » 16.09.2006 08:09:16

Hi.

Code: Alles auswählen

echo Nachricht > /dev/tty5
schreibt in der Console 5 an der aktuellen Cursor-Position den Text "Nachricht".
Gleich funktioniert auch mit SSH-Verbindungen auf bspw. /dev/pts/2

Ist es auch möglich, dass man auch die Position dieser "Nachricht" bestimmen kann?

Denn ich möchte gerne bei bestimmten wichtigen System-Ereignissen Statusinformation rechts oben in der Ecke aller aktiven root-Consolen aus einem BASH-Hintergrundscript einblenden lassen.


Gruß

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 16.09.2006 12:22:03

hi,

Auf der Linux-Textconsole und im Original X11 xterm geht's gut,
Terminalemulatoren, die mit Windowmanagern mitgeliefert werden,
unterstützen nicht immer alle Funktionen.

Code: Alles auswählen

echo -e '\e[1;71HEckentext'
echo -e -n '\e7\e[3;25r\e[2;72H\e[43;34m Alarm! \e8'
"Eckentext" wird schon mal in die rechte obere Ecke geschrieben:
Zeile 1, Spalte 72. Aber es geht noch besser:

\e[3;25r bewirkt, dass die Meldung nicht wegscrollt -- nur die Zeilen
3 bis 25 inkl. srollen noch

\e[43;34m schaltet den Hintergrund auf gelb und die Schrift auf blau

\e7 macht ein save und \e8 das restore der Textattribute, damit die
Foreground-Ausgabe nicht durcheinanderkommt.

Ein sehr nützlicher Befehl bei solchen Experimenten ist "reset" ;)
Und natürlich: man console_codes.
Beware of programmers who carry screwdrivers.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Re: BASH - Information in einer Ecke einer TTY Schreiben

Beitrag von Joghurt » 16.09.2006 14:13:27

K.I.T.T. hat geschrieben:

Code: Alles auswählen

echo Nachricht > /dev/tty5
schreibt in der Console 5 an der aktuellen Cursor-Position den Text "Nachricht".
Gleich funktioniert auch mit SSH-Verbindungen auf bspw. /dev/pts/2
write USERNAME macht das auch

man 1 write

K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

Beitrag von K.I.T.T. » 17.09.2006 07:52:45

Nicht schlecht.
Sogar in Farbe ;-)
thx

Damit dann kann ich sehr gut was anfangen.

Allerdings ohne einen passenden Filter für diverse Programme (vi, mc, ...) sollte man das nicht anwenden.*g*

Gruß und noch einen sonnigen Sonntag

ric
Beiträge: 191
Registriert: 07.10.2004 17:26:29

Beitrag von ric » 17.09.2006 14:15:13

cosmac hat geschrieben:hi,

Auf der Linux-Textconsole und im Original X11 xterm geht's gut,
Terminalemulatoren, die mit Windowmanagern mitgeliefert werden,
unterstützen nicht immer alle Funktionen.

Code: Alles auswählen

echo -e '\e[1;71HEckentext'
echo -e -n '\e7\e[3;25r\e[2;72H\e[43;34m Alarm! \e8'
"Eckentext" wird schon mal in die rechte obere Ecke geschrieben:
Zeile 1, Spalte 72. Aber es geht noch besser:

\e[3;25r bewirkt, dass die Meldung nicht wegscrollt -- nur die Zeilen
3 bis 25 inkl. srollen noch

\e[43;34m schaltet den Hintergrund auf gelb und die Schrift auf blau

\e7 macht ein save und \e8 das restore der Textattribute, damit die
Foreground-Ausgabe nicht durcheinanderkommt.

Ein sehr nützlicher Befehl bei solchen Experimenten ist "reset" ;)
Und natürlich: man console_codes.
kann man damit auch irgendwie code ausführen lassen, beispielsweise wenn ich `date` rechts oben stehen haben will?

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 17.09.2006 14:39:43

jein -- du müsstest einen Bufferoverflow in den ANSI-dekodier-Funktionen
im Kernel finden, das ist mühsam und hässlich. Aber der echo-Befehl wird ja
auch irgendwie ausgeführt, normal in einem Script. Dann könnte es so gehen:

Code: Alles auswählen

echo -e -n '\e7\e[2;25r\e[1;52H\e[1K' ; date ; echo -en '\e8'
neu & schöner: \e[1K löscht den Anfang der ersten Zeile.
Beware of programmers who carry screwdrivers.

ric
Beiträge: 191
Registriert: 07.10.2004 17:26:29

Beitrag von ric » 17.09.2006 15:44:21

sehr schön, danke!

Code: Alles auswählen

while [ 1 ]; do sleep 1; echo -e -n '\e7\e[2;25r\e[1;52H\e[1K' ; date ; echo -en '\e8'; done &
steht ab jetzt in meiner .bashrc ;)

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 17.09.2006 16:06:25

statt while [ 1 ]; besser while true; oder while :;

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 17.09.2006 16:51:46

oder gleich vcstime aus dem Paket console-tools.
Aber das geht nur als root und nicht im xterm...
Beware of programmers who carry screwdrivers.

ric
Beiträge: 191
Registriert: 07.10.2004 17:26:29

Beitrag von ric » 17.09.2006 20:56:50

Joghurt hat geschrieben:statt while [ 1 ]; besser while true; oder while :;
warum das?

Antworten