1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

[Einführung] Escape-Sequenzen

Dieses Thema im Forum "Unix & Terminal" wurde erstellt von Squart, 07.10.05.

  1. Squart

    Squart Pomme Etrangle

    Dabei seit:
    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
     
    #1 Squart, 07.10.05
    Zuletzt bearbeitet: 08.10.05
    mullzk, slartibartfast, Bonobo und 2 anderen gefällt das.
  2. Wikinator

    Wikinator Adams Parmäne

    Dabei seit:
    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.
     
  3. commander

    commander Baldwins roter Pepping

    Dabei seit:
    25.02.04
    Beiträge:
    3.210
    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!
     
  4. Bölzebub

    Bölzebub Querina

    Dabei seit:
    27.05.05
    Beiträge:
    180
    Servus,

    nette Einführung.
    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ß.

    Auf jeden Fall!
     
  5. Squart

    Squart Pomme Etrangle

    Dabei seit:
    29.01.04
    Beiträge:
    910
    Hast du auch beachtet, dass du bei dem echo anstatt \e das Escape-Zeichen eingibst?
     
  6. Squart

    Squart Pomme Etrangle

    Dabei seit:
    29.01.04
    Beiträge:
    910
    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
     
  7. KayHH

    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
     
  8. Wikinator

    Wikinator Adams Parmäne

    Dabei seit:
    21.08.04
    Beiträge:
    1.297
    ja, crtl-v + esc, es wird auch als ^[ dargestellt, nur funktionieren tut es nicht.
     
  9. Squart

    Squart Pomme Etrangle

    Dabei seit:
    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?
     
  10. Wikinator

    Wikinator Adams Parmäne

    Dabei seit:
    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".
     

Diese Seite empfehlen