• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

[Einführung] Escape-Sequenzen

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Farbe im Terminal

Da ich vor kurzem mit Escape-Sequenzen herumgespielt habe, will ich diese euch nicht vorenthalten. Es war mühsam, sich selber zu informieren, da die Informationen weit verbreitet im Internet liegen. Deshalb schreibe ich euch diesen Artikel.
Im übrigen benutze ich xterm-color in der bash.

Was machen Escape-Sequenzen?
Mit Escape-Sequenzen ist man in der Lage, das Aussehen des Terminals zur Laufzeit zu verändern. Man kann zum Beispiel eingeben, dass jeder folgende Text rot mit weißem Hintergrund werden soll, oder aber dass der Cursor in der obersten Zeile erscheinen soll.
Escape-Sequenzen kann man auch von Programmen aus benutzen, wenn also jemand in C definieren will, dass das nächste Wort einen blauen Hintergrund haben soll, so kann er dies einfacher über Escape-Sequenzen als über ncurses machen (wobei ncurses genau diese Escape-Sequenzen benutzt).

Escape
Das Wichtigste bei Escape-Sequenzen ist, wie der Name schon sagt, dass Escape. Die letzten Wochen habe ich gesucht, wo ich das Escape-Zeichen in das Terminal eingeben konnte, es aber erst heute wieder gefunden :).

Folgende Tastenkombination ist dazu nötig: Ctrl-v und dannach ein ESC
Es erscheint im Terminal die Ausgabe ^[, wobei beide Zeichen zusammen sich wie eines verhalten.
Wenn man ein Esc-Zeichen aus einem Commandline-Tool heraus braucht, so sollte man \033 (bei C, C++ und Java) benutzen.
Im folgenden werde ich das Escape-Zeichen als \e abkürzen.

Erste Schritte
Als erstes wollen wir die Textfarbe des Terminals ändern. Wir wollen diese in diesem Beispiel rot haben. Dazu geben wir in das Terminal folgendes ein:
echo "\e[31m"
(VORSICHT: nach \e kommt ein [. Am Ende sieht das Kommando in der Shell so aus: echo "^[[31m")
Nun wird jeder folgende Text rot dargestellt.

Für die allgemeine Schreibweise werde ich Sachen, die der User für jedes Kommando selber eingeben muss, mit {...} kennzeichnen. So ist zum Beispiel {Count} irgendeine natürliche Zahl, die man eingeben muss.

Um die Texteigenschaften zu verändern geht man allgemein so vor:
\e[{attribute1};{attribute2};{...};{attributeX}m
Dabei kann man beliebig viele Attribute eingeben, wobei sich 2 verschiedene überschreiben können (so wird ein Text nicht in 2 verschiedenen Farben angezeigt, wenn ich zwei verschiedene Textfarben als Attribut eingebe).

Folgende Attribute gibt es im Terminal:
0: Attribute auf Ursprung stellen
4: Unterstrichener Text
5: Blinkender Text
7: Hintergrundfarbe und Textfarbe sind vertauscht
8: Text wird unsichtbar (!WARNUNG!: Mit Vorsicht zu genießen)

Textfarben:
30: Schwarz
31: Rot
32: Grün
33: Gelb
34: Blau
35: Magenta
36: Cyan
37: Weiß

Hintergrundfarben:
40: Schwarz
41: Rot
42: Grün
43: Gelb
44: Blau
45: Magenta
46: Cyan
47: Weiß


Weitere Befehle
Es ist langweilig, alle möglichen Befehle aufzuzählen, deshalb kommt dies jetzt in 2 Rutschen (1 - Für den User; 2 - Für den Programmierer(der auch erstere benutzen kann; diese Befehle machen als Benutzer keinen Sinn))
User-Befehle:

Löschen des Bildschirms: echo "\ec"
Curser {Count} Zeilen hoch bewegen: echo "\e[{Count}A"
Curser {Count} Zeilen runter bewegen: echo "\e[{Count}B"
Curser genau Positionieren: echo "\e[{Row};{Column}H"



so, dies war es auch schon. Für die C-Programmierer habe ich noch ein kleines Beispiel (Man hätte zwar die Ausgabe größtenteils in eine Zeile bekommen, aber dann wäre der Code schwerer zu verstehen und zu pflegen):
Code:
#include <stdio.h>

int main(int argc, char *argv[]) {
  int i;
  for (i = 0; i <= 20; i++) {
    printf("Noch ");

    printf("\033[%dm", i%8+30);   // Textfarbe setzen
    if (i % 2 == 0)
      printf("\033[4m");    // Unterstreichen

    printf("%2d",20-i); // Zahl ausgeben

    printf("\033[0m"); // alle Änderungen rückgaengig machen

    printf(" Sekunden...\n"); // Wichtig ist das \n -> Cursor geht in die nächste Zeile
    sleep(1);  // Eine Sekunde warten

    printf("\033[1A"); // In die Zeile oben drüber gehen
  }
  printf("\n");

  return 0;
}

Viel Spass beim herumspielen
Squart
 
Zuletzt bearbeitet:

Wikinator

Adams Parmäne
Registriert
21.08.04
Beiträge
1.297
sehr interessant, danke für die Einführung.

Kann es sein, dass Linux andere Zeichen für das Escape-Zeichen verwendet? Die echo-beispiele funktionieren so nicht, das C-Script schon.
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
Danke, danke, das gibt Karma.... nur, warum?

Ich hatte mehrmals die letzten Tage das Problem, mit telnet verschiedene Ports anzusprechen, und da man ja im positiven Falle alle Tastatureingaben auf den Port umlenkt, hat weder Apfel-C, ctrl-c, Apfel-Q, ctrl-q oder sonstwas eingebenes genutzt - mit ctrl-v und Escape gehts plötzlich - wussten nicht mal die UNIX - Urgesteine in meiner Firma - ich musste die Session schliessen, um zu entkommen!

Bedankt!
 

Bölzebub

Querina
Registriert
27.05.05
Beiträge
180
Servus,

nette Einführung.
Squart schrieb:
Es war mühsam, sich selber zu informieren, da die Informationen weit verbreitet im Internet liegen.
Das glaube ich sofort. Das sind so Sachen, nach denen man ewig sucht, wenn man sie mal braucht.

Könntest du nach deine Quellen nennen? Da steht doch sicher noch vieles interessantes, was man so nicht unbedingt weiß.

commander schrieb:
Danke, danke, das gibt Karma....
Auf jeden Fall!
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Wikinator schrieb:
sehr interessant, danke für die Einführung.

Kann es sein, dass Linux andere Zeichen für das Escape-Zeichen verwendet? Die echo-beispiele funktionieren so nicht, das C-Script schon.
Hast du auch beachtet, dass du bei dem echo anstatt \e das Escape-Zeichen eingibst?
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Bölzebub schrieb:
Könntest du nach deine Quellen nennen? Da steht doch sicher noch vieles interessantes, was man so nicht unbedingt weiß.
Sorry, ich finde es nicht mehr. Ich habe auch so lange googeln müssen, um wieder die Kombination zu finden.

Eigentlich bin ich über ncurses darauf gestoßen. Dazu habe ich folgenden Artikel angefangen:
http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/
Und auch noch das Terminal ein bisschen modifiziert:
http://www.osxentwicklerforum.de/thread.php?threadid=2541

Allerdings habe ich noch eine Quelle gehabt, die ich nicht mehr finde.

(AHH, ich sehe, dass die Lösung für die Escape-Zeichen-Eingabe auch in dem ncurses-Artikel ist :mad: :-c)

Zuletzt habe ich mir noch eine mini Man-Page geschrieben. Wenn diese jemand haben will, ich gebe sie gerne. Ist unter dem Namen xterm-color bei mir gespeichert.


Viele Dank bei allen für das Karma und eine gute Nacht
Squart
 

KayHH

Gast
Moin apfeltalker,

tja, das waren noch Zeiten, damals auf der guten alten VAX *schwelg*. Da mussten wir öfter mal die Escape-Sequenzen der VT100 Terminals verwenden. Grafische Benutzeroberflächen gab es ja noch nicht, aber mit den Escape-Sequenzen konnte man sich Pseudofenster auf's Terminal zaubern. Die Original-Handbücher von damals mit den ganzen Escape-Sequenzen gibt es hier zum Download. Insbesondere das VT100 Handbuch kann ich dazu empfehlen, da es den Standard darstellt.


Gruss KayHH
 

Wikinator

Adams Parmäne
Registriert
21.08.04
Beiträge
1.297
Squart schrieb:
Hast du auch beachtet, dass du bei dem echo anstatt \e das Escape-Zeichen eingibst?
ja, crtl-v + esc, es wird auch als ^[ dargestellt, nur funktionieren tut es nicht.
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Funktioniert keiner der angegebenen Sachen? Hast du vielleicht vergessen ein '[' einzugeben, was bei den meisten Kombinationen gebraucht wird? Was bekommst du als Ausgabe, wenn du echo $TERM eingibst?
 

Wikinator

Adams Parmäne
Registriert
21.08.04
Beiträge
1.297
bei einem "echo "^[[31m" wird "^[[31m" ausgegeben". Auch "echo "\033[31m" funktioniert nicht.
echo $TERM liefert "xterm-color".