%20in%20der%20Shell%20anders%20an.png)
Wenn Sie Steuerzeichen in der Shell eingeben, werden diese in der sogenannten "Caret-Notation" angezeigt. Escape wird beispielsweise ^[
in der Caret-Notation geschrieben.
Ich möchte meine Bash-Shell anpassen, damit sie cool aussieht. Ich habe zum Beispiel mein PS1
und geändert PS2
, sodass es farbig wird. Ich möchte jetzt auch, dass Steuerzeichen ein einzigartiges Erscheinungsbild erhalten, damit sie besser von normalen Zeichen unterscheidbar sind.
$ # 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, meine Shell so einzustellen, dass Steuerzeichen anders hervorgehoben werden?
Ist es möglich, sie in einer fetten Schriftart anzuzeigen oder sie vielleicht in einer anderen Farbe als den normalen Text erscheinen zu lassen?
ich benutzeSchlagShell hier, aber ich habe die Frage nicht mit markiert, bash
weil es vielleicht eine Lösung gibt, die auf viele verschiedene Shells zutrifft.
Notizdass ich nicht weiß, auf welcher Ebene die Hervorhebung der Steuerzeichen erfolgt. Ich dachte zuerst, es läge in der Shell selbst. Jetzt habe ich gehört, dass esZeile lesendas steuert, wie Steuerzeichen in Shells wieSchlag. Die Frage ist jetzt also mit gekennzeichnet readline
und ich suche immer noch nach Antworten.
Antwort1
Wenn Sie drücken Ctrl+X, schreibt Ihr Terminalemulator das Byte 0x18 auf die Masterseite des Pseudoterminalpaares.
Was als nächstes passiert, hängt davon ab, wie die TTY-Leitungsdisziplin (ein Softwaremodul im Kernel, das zwischen der Master-Seite (unter der Kontrolle des Emulators) und der Slave-Seite (mit der im Terminal ausgeführte Anwendungen interagieren) sitzt) konfiguriert ist.
Ein Befehl zum Konfigurieren diesesTTY-Line-Disziplinist der stty
Befehl.
Wenn eine solche dumme Anwendung cat
nicht weiß und es ihr egal ist, ob ihr Standard-DIN ein Terminal ist oder nicht, befindet sich das Terminal in einem Standard-kanonischModus, in dem die TTY-Leitungsdisziplin eine grobeZeileneditor.
Einige interaktive Anwendungen, die mehr als diese einfachenZeileneditorNormalerweise ändern Sie diese Einstellungen beim Start und stellen sie beim Verlassen wieder her. Moderne Shells,auf ihre Aufforderungsind Beispiele für solche Anwendungen. Sie implementieren ihren eigenen, fortgeschritteneren Zeileneditor.
Wenn 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 (der vor der Ausgabe der Eingabeaufforderung aktiv war).
Wenn Sie den stty -a
Befehl ausführen, sehen Sie die aktuellen Einstellungen fürdumme Anwendungen. Wahrscheinlich werden Sie sehen icanon
, dass die Einstellungen echo
und echoctl
aktiviert sind.
Das bedeutet:
icanon
: dieser Rohzeileneditor ist aktiviert.echo
: Die von Ihnen eingegebenen Zeichen (die der Terminalemulator auf die Masterseite schreibt) werdenhalltezurück (zum Lesen durch den Terminalemulator bereitgestellt).echoctl
: anstatthallteDie Steuerzeichen sindhallteals^X
.
Nehmen wir also an, Sie geben ein A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.
Ihr Terminalemulator sendet: AB\bC\x18\b\r
. Die Zeilendisziplin wirdEchozurü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
.
Die Anwendung sieht nur AC\n
, und zwar nur, wenn Sie drücken. EnterSie hat daher keine Kontrolle über die Ausgabe ^X
dort.
Sie werden feststellen, dass fürEcho, das erste ^H
( ^?
bei manchen Terminals, siehe die erase
Einstellung) führte dazu, dass \b \b
es an das Terminal zurückgesendet wurde. Das ist die Sequenz, um den Cursor zurück zu bewegen, mit Leerzeichen zu überschreiben, den Cursor wieder zurück zu bewegen, während das zweite ^H
dazu führte, \b \b\b \b
dass diese beiden ^
und X
Zeichen gelöscht wurden.
Die (0x18) selbst wurde in und für die Ausgabe ^X
übersetzt . Wie hat es nicht die Anwendung erreicht, da wir sie mit der Rücktaste gelöscht haben.^
X
B
\r
(auch bekannt als ^M
) wurde in \r\n
( ^M^J
) für Echo und \n
( ^J
) für die Anwendung übersetzt.
Welche Möglichkeiten haben wir also für diesedummAnwendungen:
- deaktivieren
echo
(stty -echo
). Das ändert effektiv die Art und Weise, wie Steuerzeichen wiedergegeben werden, indem... nichts wiedergegeben wird. Nicht wirklich eine Lösung. - deaktivieren
echoctl
. Dadurch wird die Art und Weise geändert, wie Steuerzeichen (außer^H
,^M
... und alle anderen vom Zeileneditor verwendeten) ausgegeben werden. Sie werden dannhallteso wie es ist. Das heißt zum Beispiel, das ESC-Zeichen wird als\e
(^[
/0x1b
)-Byte gesendet (was vom Terminal als Beginn einer Escape-Sequenz erkannt wird),^G
Sie senden ein\a
(BEL, wodurch Ihr Terminal piept)... Keine Option. - Deaktivieren Sie den einfachen Zeileneditor (
stty -icanon
). Dies ist keine wirkliche Option, da die einfachen Anwendungen dadurch wesentlich weniger benutzbar würden. - editieren Sie den Kernel-Code, um das Verhalten der TTY-Zeilendisziplin zu ändern, so dass dieEchoeines Steuerzeichens sendet,
\e[7m^X\e[m
anstatt nur^X
(hier\e[7m
wird in den meisten Terminals normalerweise die umgekehrte Darstellung aktiviert).
Eine Möglichkeit wäre, einen Wrapper wie rlwrap
diesen zu verwenden, der ein schmutziger Hack ist, um dummen Anwendungen einen schicken Zeileneditor hinzuzufügen. Dieser Wrapper versucht tatsächlich, einfache read()
s vom Terminalgerät durch Aufrufe des Readline-Zeileneditors zu ersetzen (die den Modus der TTY-Zeilendisziplin ändern).
Wenn Sie noch einen Schritt weiter gehen möchten, können Sie Lösungen wieDieses hierdas alle Eingaben vom Terminal kapert, um sie durch den Zeileneditor von zsh laufen zu lassen (der zufällig ^X
s in invertierter Darstellung hervorhebt) und sich dabei auf die Funktion des GNU-Bildschirms verlässt :exec
.
Bei Anwendungen, die einen eigenen Zeileneditor implementieren, liegt es an ihnen, zu entscheiden, wie derEchoist erledigt. bash
Verwendet hierfür Readline, das keine Unterstützung für die Anpassung der Wiedergabe von Steuerzeichen bietet.
Siehe hierzu zsh
:
info --index-search='highlighting, special characters' zsh
zsh
hebt standardmäßig nicht druckbare Zeichen hervor. Sie können die Hervorhebung beispielsweise wie folgt anpassen:
zle_highlight=(special:fg=white,bg=red)
Für die Hervorhebung dieser Sonderzeichen in Weiß auf Rot.
Die Textdarstellung dieser Zeichen ist jedoch nicht anpassbar.
In einem UTF-8-Gebietsschema wird 0x18 als ^X
, \u378
, \U7fffffff
(zwei nicht zugewiesene Unicode-Codepunkte), als <0378>
, <7FFFFFFF>
, \u200b
(ein nicht wirklich druckbares Unicode-Zeichen) als gerendert <200B>
.
\x80
^�
in einem ISO8859-1-Gebietsschema würde es als … usw. wiedergegeben .
Antwort2
Normalerweise habe ich diesen Code in meiner .bashrc-Datei:
function get_exit_status()
{
local code=$?
if [ $code -ne 0 ]
then
printf $'\001\033[31m\002'"($code)"$'\001\033[0m\002'" "
fi
}
und dann rufe ich diese Funktion in meiner PS1 auf
PS1='\u@\h \w $(get_exit_status)'
Wenn Sie ^C drücken, wird es in Ihrer Eingabeaufforderung angezeigt
I@mycomputer ~ ^C
I@mycomputer ~ (130)
Alle Exit-Statuscodes ungleich „0“ werden abgefragt.