Wenn Sie drücken Ctrl+X, schreibt Ihr Terminal-Emulator das Byte 0x18 auf die Masterseite des Pseudo-Terminal-Paares.
Was als nächstes passiert, hängt davon ab, wie die tty line-Disziplin (ein Softwaremodul im Kernel, das sich zwischen der Masterseite (unter Kontrolle des Emulators) und der Slaveseite (mit welchen Anwendungen das Terminal interagiert) befindet) konfiguriert ist.
Ein Befehl zum Konfigurieren dieser tty-Zeilendisziplin ist der stty
Befehl.
Wenn eine dumme Anwendung ausgeführt wird wie cat
das nicht bewusst ist , und kümmert sich nicht darum , ob seine stdin ein Terminal ist oder nicht, ist das Terminal in einem Standard kanonische Modus , in dem die Disziplin Geräte tty Linie eine grobe Editor Linie .
Einige interaktive Anwendungen, die mehr als diesen einfachen Zeileneditor benötigen, ändern diese Einstellungen normalerweise beim Start und stellen sie beim Verlassen wieder her. Moderne Muscheln, an ihrem Prompt sind Beispiele für solche Anwendungen. Sie implementieren ihren eigenen erweiterten Zeileneditor.
Während Sie eine Befehlszeile eingeben, versetzt die Shell die tty-Zeilendisziplin in diesen Modus. Wenn Sie die Eingabetaste drücken, um den aktuellen Befehl auszuführen, stellt die Shell den normalen tty-Modus wieder her (wie er vor der Ausgabe der Eingabeaufforderung wirksam war).
Wenn Sie den stty -a
Befehl ausführen , werden die aktuellen Einstellungen für die dummen Anwendungen angezeigt . Du bist wahrscheinlich die , um zu sehen icanon
, echo
und die echoctl
Einstellungen werden aktiviert.
Was das bedeutet ist, dass:
icanon
: Der Rohzeileneditor ist aktiviert.
echo
: Zeichen (dass der Terminal - Emulator schreibt an die Master - Seite) sind vom Typ Echo zurück (zur Verfügung gestellt für das Lesen durch den Terminal - Emulator).
echoctl
: Anstatt dass wiederholte asis, werden die Steuerzeichen hallte wie ^X
.
Angenommen, Sie tippen A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.
Ihr Terminal - Emulator sendet: AB\bC\x18\b\r
. Die Zeilendisziplin gibt zurück: AB\b \bC^X\b \b\b \b\r\n
und eine Anwendung, die die Eingabe von der Slave-Seite ( /dev/pts/x
) liest, liest AC\n
.
Alles, was die Anwendung sieht, ist AC\n
, und nur wenn Sie drücken Enter, kann sie keine Kontrolle über die Ausgabe für ^X
dort haben.
Sie werden feststellen, dass für Echo das erste ^H
( ^?
bei einigen Terminals, siehe erase
Einstellung) \b \b
zum Terminal zurückgesendet wurde. Das ist die Folge , um den Cursor zurück zu bewegen, überschrieben mit Raum, bewegt den Cursor wieder zurück, während die zweite ^H
in Folge , \b \b\b \b
diese beiden zu löschen ^
und X
Zeichen.
Das ^X
(0x18) selbst wurde in ^
und X
für die Ausgabe übersetzt. Als ob B
es nicht in die Anwendung geschafft hätte, da wir es mit Backspace gelöscht haben.
\r
(aka ^M
) wurde für das Echo in ( ) und für die Anwendung in \r\n
( ^M^J
) übersetzt .\n
^J
Also, was sind unsere Optionen für diese dummen Anwendungen:
- deaktiviere
echo
( stty -echo
). Dies ändert effektiv die Art und Weise, wie Steuerzeichen wiedergegeben werden, indem ... nichts wiedergegeben wird. Keine wirkliche Lösung.
- deaktivieren
echoctl
. Dadurch wird die Art und Weise geändert, in der Steuerzeichen (außer ^H
, ^M
... und alle anderen vom Zeileneditor verwendeten) wiedergegeben werden. Sie werden dann unverändert wiedergegeben . Das heißt, das ESC-Zeichen wird als \e
( ^[
/ 0x1b
) Byte gesendet (das vom Terminal als Beginn einer Escape-Sequenz erkannt wird), ^G
Sie senden ein \a
(ein BEL, wodurch Ihr Terminal piept) ... Keine Option .
- Deaktivieren Sie den Rohzeilen-Editor (
stty -icanon
). Nicht wirklich eine Option, da die Rohanwendungen viel weniger verwendbar wären.
- Bearbeiten Sie den Kernel-Code, um das Verhalten der tty-Zeilendisziplin so zu ändern, dass das Echo eines Steuerzeichens
\e[7m^X\e[m
statt nur gesendet wird ^X
( \e[7m
in den meisten Terminals wird hier normalerweise das Rückvideo aktiviert).
Eine Option könnte sein, einen solchen Wrapper zu verwenden rlwrap
, der ein schmutziger Hack ist, um dummen Anwendungen einen ausgefallenen Zeileneditor hinzuzufügen. Dieser Wrapper versucht tatsächlich, einfache read()
s vom Endgerät zu ersetzen , um Aufrufe des Zeileneditors zu lesen (die den Modus der tty-Zeilendisziplin ändern).
Wenn Sie noch weiter gehen, können Sie sogar Lösungen wie diese ausprobieren , bei denen alle Eingaben vom Terminal entführt werden, um den Zeileneditor von zsh (der zufällig ^X
s im umgekehrten Video hervorhebt ) zu durchlaufen, wobei Sie auf die Funktion des GNU-Bildschirms angewiesen sind :exec
.
Für Anwendungen, die einen eigenen Zeileneditor implementieren, müssen sie nun entscheiden, wie das Echo erfolgen soll. bash
verwendet readline für das, was keine Unterstützung für das Anpassen der Echowiedergabe von Steuerzeichen bietet.
Für zsh
finden Sie unter :
info --index-search='highlighting, special characters' zsh
zsh
hebt standardmäßig nicht druckbare Zeichen hervor. Sie können die Hervorhebung zum Beispiel anpassen mit:
zle_highlight=(special:fg=white,bg=red)
Für die Hervorhebung von Weiß auf Rot für diese Sonderzeichen.
Die Textdarstellung dieser Zeichen ist jedoch nicht anpassbar.
In einem UTF-8 locale wird 0x18 gemacht als ^X
, \u378
, \U7fffffff
(zwei nicht zugewiesene Unicode - Codepunkte) als <0378>
, <7FFFFFFF>
, \u200b
(eine nicht wirklich druckbaren Unicode - Zeichen) wie <200B>
.
\x80
in einem iso8859-1-Gebietsschema würde gerendert als ^�
... etc.
bash
sie istreadline
das Zeug Handhabung und für die meisten anderen ist es die tty - Treiber.