GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man Steuerzeichen (^c, ^d, ^[, …) in der Shell anders darstellen?

Wenn Sie Steuerzeichen in die Shell eingeben, werden diese in der sogenannten „Caret-Notation“ angezeigt. Escape wird beispielsweise als ^[ geschrieben in Caret-Notation.

Ich passe meine Bash-Shell gerne an, damit sie cool aussieht. Ich habe zum Beispiel meine PS1 geändert und PS2 eingefärbt werden. Ich möchte jetzt, dass auch Steuerzeichen ein einzigartiges Aussehen erhalten, um sie besser von normalen Zeichen unterscheiden zu können.

$ # Here I type CTRL-C to abort the command.
$ blahblah^C
          ^^ I want these two characters to be displayed differently

Gibt es eine Möglichkeit, Steuerzeichen in meiner Shell anders hervorzuheben?

Ist es möglich, sie in Fettschrift oder in anderen Farben als normaler Text anzuzeigen?

Ich verwende bash Shell hier, aber ich habe die Frage nicht mit bash getaggt denn vielleicht gibt es eine Lösung, die für viele verschiedene Shells gilt.

Hinweis dass ich nicht weiß, auf welcher Ebene die Hervorhebung von Steuerzeichen erfolgt. Ich dachte erst es liegt an der Schale selbst. Jetzt habe ich gehört, dass es readline ist das steuert, wie Steuerzeichen in Shells wie bash sind . Also ist die Frage jetzt mit readline getaggt und ich suche immer noch nach Antworten.

Akzeptierte Antwort:

Wenn Sie Strg+X drücken schreibt Ihr Terminal-Emulator das Byte 0x18 auf die Master-Seite des Pseudo-Terminal-Paares.

Was als nächstes passiert, hängt davon ab, wie die tty-Leitungsdisziplin (ein Softwaremodul im Kernel, das sich zwischen der Master-Seite (unter der Kontrolle des Emulators) und der Slave-Seite (mit der im Terminal laufende Anwendungen interagieren)) konfiguriert ist.

Ein Befehl zum Konfigurieren dieser TTY-Zeilendisziplin ist die stty Befehl.

Beim Ausführen einer dummen Anwendung wie cat das nicht weiß und sich nicht darum kümmert, ob seine stdin ein Terminal ist oder nicht, das Terminal befindet sich in einem standardmäßigen canonical Modus, in dem die tty-Zeilendisziplin einen groben Zeileneditor implementiert .

Einige interaktive Anwendungen, die mehr als diesen primitiven Zeileneditor benötigen Ändern Sie diese Einstellungen normalerweise beim Start und stellen Sie sie beim Verlassen wieder her. Moderne Shells, an ihrer Eingabeaufforderung sind Beispiele für solche Anwendungen. Sie implementieren ihren eigenen fortschrittlicheren Zeileneditor.

Während Sie eine Befehlszeile eingeben, versetzt die Shell normalerweise die tty-Zeilendisziplin in diesen Modus, und wenn Sie die Eingabetaste drücken, um den aktuellen Befehl auszuführen, stellt die Shell den normalen tty-Modus wieder her (wie er vor Ausgabe der Eingabeaufforderung wirksam war). /P>

Wenn Sie stty -a ausführen Befehl, sehen Sie die aktuellen Einstellungen, die für die dummen Anwendungen verwendet werden . Wahrscheinlich sehen Sie das icanon , echo und echoctl Einstellungen aktiviert werden.

Das bedeutet Folgendes:

  • icanon :dieser grobe Zeileneditor ist aktiviert.
  • echo :Von Ihnen eingegebene Zeichen (die der Terminal-Emulator auf die Master-Seite schreibt) werden echoed zurück (vom Terminal-Emulator zum Lesen bereitgestellt).
  • echoctl :anstatt echoed zu werden Dabei werden die Steuerzeichen echoed als ^X .

Nehmen wir also an, Sie geben A ein B Backspace-auch bekannt als Strg+H/? C Strg+X Rücktaste Zurück .

Ihr Terminal-Emulator sendet:ABbCx18br . Die Liniendisziplin wird echo Rückseite:ABb bC^Xb bb brn , und eine Anwendung, die die Eingabe von der Slave-Seite liest (/dev/pts/x ) liest ACn .

Alles, was die Anwendung sieht, ist ACn , und nur wenn Sie Enter drücken es kann also keine Kontrolle über die Ausgabe für ^X haben dort.

Verwandte:Was liest die conf-Datei zwischen Login- und Nicht-Login-Shell?

Sie werden das bei echo bemerken , das erste ^H (^? bei einigen Terminals siehe erase Einstellung) führte zu b b an das Terminal zurückgesendet. Das ist die Sequenz, um den Cursor zurück zu bewegen, mit Leerzeichen zu überschreiben, den Cursor wieder zurück zu bewegen, während der zweite ^H führte zu b bb b um diese beiden ^ zu löschen und X Zeichen.

Der ^X (0x18) selbst wurde in ^ übersetzt und X für Ausgabe. Wie B , hat es nicht in die Anwendung geschafft, da wir es mit der Rücktaste gelöscht haben.

r (auch bekannt als ^M ) wurde in rn übersetzt (^M^J ) für echo und n (^J ) für die Anwendung.

Also, was sind unsere Möglichkeiten für diese Dummen Anwendungen:

  • deaktiviere echo (stty -echo ). Das ändert effektiv die Art und Weise, wie Steuerzeichen wiedergegeben werden, indem … nichts wiedergegeben wird. Nicht wirklich eine Lösung.
  • deaktiviere echoctl . Das ändert die Art und Weise, wie Steuerzeichen (außer ^H , ^M … und alle anderen vom Zeileneditor verwendeten) werden geechot. Sie werden dann echoed wie es ist. Das heißt zum Beispiel, das ESC-Zeichen wird als e gesendet (^[ /0x1b ) Byte (das vom Terminal als Beginn einer Escape-Sequenz erkannt wird), ^G Sie senden einen a (ein BEL, das Ihr Terminal piepen lässt)… Keine Option.
  • Deaktivieren Sie den groben Zeileneditor (stty -icanon ). Nicht wirklich eine Option, da die groben Anwendungen viel weniger brauchbar werden würden.
  • bearbeite den Kernel-Code, um das Verhalten der tty-Zeilendisziplin zu ändern, also das echo eines Steuerzeichens sendet e[7m^Xe[m statt nur ^X (hier e[7m aktiviert in den meisten Terminals normalerweise Reverse-Video).

Eine Option könnte sein, einen Wrapper wie rlwrap zu verwenden Das ist ein schmutziger Hack, um dummen Anwendungen einen ausgefallenen Zeileneditor hinzuzufügen. Dieser Wrapper versucht tatsächlich, einfaches read() zu ersetzen s vom Endgerät zu Aufrufen des readline-Zeileneditors (der den Modus der tty-Zeilendisziplin ändert).

Wenn Sie noch weiter gehen, könnten Sie sogar Lösungen wie diese ausprobieren, die alle Eingaben vom Terminal entführen, um den Zeileneditor von zsh zu durchlaufen (der zufällig ^X hervorhebt s in Reverse-Video) basierend auf :exec von GNU screen Funktion.

Für Anwendungen, die ihren eigenen Zeileneditor implementieren, liegt es nun an ihnen zu entscheiden, wie das echo ist fertig. bash verwendet readline für das, was keine Unterstützung für die Anpassung der Echos von Steuerzeichen bietet.

Für zsh , siehe:

info --index-search='highlighting, special characters' zsh

zsh hebt standardmäßig nicht druckbare Zeichen hervor. Sie können die Hervorhebung beispielsweise anpassen mit:

zle_highlight=(special:fg=white,bg=red)

Zur weißen auf roten Hervorhebung dieser Sonderzeichen.

Die Textdarstellung dieser Zeichen ist jedoch nicht anpassbar.

In einem UTF-8-Gebietsschema wird 0x18 als ^X gerendert , u378 , U7fffffff (zwei nicht zugewiesene Unicode-Codepunkte) als <0378> , <7FFFFFFF> , u200b (ein nicht wirklich druckbares Unicode-Zeichen) als <200B> .

x80 in einem iso8859-1-Gebietsschema würde als ^� gerendert werden … usw.


Linux
  1. Wie konvertiere ich Hex in ASCII-Zeichen in der Linux-Shell?

  2. So übergeben Sie ein Argument in Expect über die Befehlszeile in einem Shell-Skript

  3. Holen Sie sich die ersten 5 Zeichen aus jeder Zeile im Shell-Skript

  4. Wie führe ich den Vim-Befehl von der Shell aus?

  5. Wie kann ich den Dateiinhalt rekursiv anzeigen?

So bereinigen Sie Ihre Daten in der Befehlszeile

So ändern Sie die Standard-Shell im Linux-System

Wie liest man Befehlszeilenargumente in Shell-Skripten?

So funktioniert die Versionskontrolle mit Git auf der Kommandozeile

Option zur Anzeige von Steuerzeichen in gedit

Wie werden die für den aktuellen Start angegebenen Linux-Kernel-Befehlszeilenparameter angezeigt?