Wenn ich mich an der Konsole anmelde, drücke ich upabsichtlich auf den Pfeil, um die zuvor eingegebenen Befehle anzuzeigen. Aber ich sehe das ^[[A
.
Aber wenn ich die Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down WinTasten drücke, werden keine Zeichen wiedergegeben.
Was könnte der Grund dafür sein?
Bedeutet eine ^[[A
Art von Zeichen etwas?
getty
oder verschlucktlogin
, obwohl ich nicht sicher bin, warum. Nach fundierten Vermutungen wird der Druckbildschirm aus historischen Gründen vom Kernel speziell interpretiert. Ich bin mir jedoch nicht 100% sicher, außer bei den Modifikatoren.Tastaturen senden Ereignisse an den Computer. Ein Ereignis lautet "Scan Code nnn down" oder "Scan Code nnn up". Am anderen Ende der Kette erwarten Anwendungen, die in einem Terminal ausgeführt werden, Eingaben in Form einer Folge von Zeichen. (Es sei denn, sie haben einen unformatierten Zugriff angefordert, wie dies der X-Server tut.) Wenn Sie drücken A, sendet die Tastatur die Information "Scan-Code 38 nach unten". Der Konsolentreiber schlägt seine Tastaturbelegung nach und wandelt diese in "Zeichen
a
" um (wenn keine Modifizierertaste gedrückt wird).Wenn Sie eine Taste oder Tastenkombination drücken, die kein Zeichen ergibt, müssen die Informationen in Zeichen codiert werden. Einige Tasten und Tastenkombinationen haben entsprechende Steuerzeichen, z. B. Ctrl+ Asendet das Zeichen
␁
(Bytewert 1), Returnsendet das Zeichen␍
(Strg + M, Bytewert 13) usw. Die meisten Funktionstasten haben kein entsprechendes Zeichen und senden stattdessen Eine Zeichenfolge, die mit dem Zeichen␛
(Escape, Byte-Wert 27) beginnt . Beispielsweise wird der Schlüssel Upin die Escape-Sequenz übersetzt␛[A
(drei Zeichen: Escape, offene Klammer, Großbuchstabe A).Die Aufforderung zur Eingabe des Benutzernamens auf der Konsole ist dumm und versteht die meisten Escape-Sequenzen nicht. Es verfügt nicht über die gewohnten Funktionen für Line Edition und Verlauf: Diese werden von der Shell bereitgestellt. Bis Sie sich anmelden, ist keine Shell vorhanden. Es wird also einfach die Escape-Sequenz angezeigt. Es gibt kein Symbol für das
␛
Zeichen, daher wird es als angezeigt^[
. Das^
Vorzeichen wird traditionell als Präfix für Steuerzeichen verwendet, und Escape wird^[
aufgrund seines Bytewerts verwendet: Es ist der Bytewert von[
minus 64.Wenn Sie Upan einer Shell-Eingabeaufforderung auf drücken , wird dieselbe dreistellige Sequenz an Ihre Shell gesendet. Die Shell interpretiert dies als Befehlssequenz (normalerweise zum Aufrufen des vorherigen Verlaufselements). Wenn Sie die Taste Ctrl+ Vdann Upam Shell - Prompt, diese Einsätze der Escape - Sequenz an der Eingabeaufforderung: Ctrl+ Vist ein Befehl , um das nächste Zeichen wörtlich statt zu interpretieren es als Befehl einzufügen, so dass das
␛
ist Zeichen nicht als Beginn einer Escape - Sequenz interpretiert .Einige Tasten sind nur Modifikatoren und werden nicht an Terminalanwendungen übertragen. Wenn Sie beispielsweise drücken Shift, verbleiben diese Informationen im Terminal-Treiber und werden berücksichtigt, wenn Sie dann drücken A, sodass der Treiber statt
A
an die Anwendung sendeta
.Darüber hinaus sind möglicherweise einige Funktionstasten in Ihrer Konsole nicht zugeordnet.
Eine ähnliche Ansicht in der GUI finden Sie unter Was ist der Metaschlüssel von bash?
quelle
Es geht nicht darum, wie die Tasten vom "Terminal" (dh der Terminal-Emulator-Anwendung) dargestellt werden. Was Sie sehen, ist der ANSI-Code ( ANSI-Escape-Sequenz ), mit dem Sie eine Zeile nach oben springen können, der jedoch in eine druckbare Form übersetzt wurde.
Tastaturhardware sendet "Scan-Codes", diese werden jedoch übersetzt und als Zeichen für Anwendungen auf Kommandozeilenebene angezeigt. Die Taste Awird zu einem einzelnen Byte:
A
Wenn die Umschalttaste gedrückt ist (oder die Umschalttaste gedrückt ist),a
andernfalls.In einem ANSI-kompatiblen Terminal, mit den Pfeiltasten senden nicht ein einzelnes Zeichen (es gibt keine Codes für Pfeile im ASCII - Zeichensatz), aber ein 3-Zeichen „Escape - Sequenz“:
escape-[-A
. Die anderen drei Pfeiltasten sindescape-[-B, C, D
.Dieselbe Zeichenfolge würde den Cursor um eine Zeile nach oben bewegen, wenn er an ein altes physisches ANSI-Terminal gesendet (zurückgesendet) wird. Viele Programme, einschließlich Terminalemulatoren, erkennen diese Zeichenfolgen und führen entsprechende Aktionen aus: Terminalemulatoren bewegen den Cursor nach oben (so
curses
bewegt die Bibliothek den Cursor),bash
fangen ihn jedoch ab und rollen stattdessen durch den Verlauf.Um zu vermeiden, dass der Cursor in Programmen, die nicht zum Bewegen des Cursors auf dem Bildschirm verwendet werden können, überall angezeigt wird, wird bei Tastatureingaben häufig ESC als druckbare Sequenz angezeigt
^[
(da Escape entsprichtcontrol-[
). Dies wird tatsächlich von der Endgeräteschnittstelle erledigt; sehenstty(1)
. Infolgedessen wird der Aufwärtspfeil als angezeigt^[[A
. Sie sehen dies in der Befehlszeile, wenn Sie die Eingabetastecat
drücken und einige Pfeiltasten drücken. Dies haben Sie auch auf dem Anmeldebildschirm der Konsole gesehen.Schließlich: Control, Altund die anderen Tasten , die Sie nicht auf Zeichenfolge erwähnt ordnen. Sie beeinflussen den Charakter von einem anderen keypress gesendet (wie das
a
/A
obigen Beispiel), oder sie haben einfach keine Zuordnung zu Text. Solche Tastendrücke können nur von Programmen erkannt werden, die Tastaturereignisse abhören. Sie können nicht von der Standardeingabe gelesen (oder in eine Datei geschrieben) werden.quelle
Dieses Verhalten unterscheidet sich von Shell zu Shell. Die meisten Shells verwenden eine Bibliothek, die aufgerufen wird
readline
, um Zeilen in der Eingabeaufforderung zu bearbeiten. Hier finden Sie eine vollständige Befehlsreferenz für diese Bibliothek. Wenn eine Anwendung verwendet wird, könnenreadline
Sie die Zeilen mit diesen Befehlen bearbeiten und navigieren.Die vertikalen Pfeiltasten sind in der Readline konfiguriert, um im Befehlsverlauf zu navigieren. Und in der Login-Promt gibt es keine Befehlsgeschichte. Deshalb werden die Zeichen
^[[A
und^[[B
auf dem Bildschirm gedruckt. Also, was bedeutet^[[A
das?Die Manualpage von bash sagt unter
PROMPTING
:Die Escape-Sequenzen für die Pfeiltasten in ANSI lauten:
[ValueA
Cursor nach oben (woValue
kann leer sein)[ValueB
Cursor runter (woValue
kann leer sein)quelle
login
, was nichts mit der Anmeldeaufforderung zu tun hatbash
.bash
undlogin
verwenden dieselbe Bibliothek (readline), um Zeilen zu bearbeiten. Der Unterschied ist nur, dasslogin
Sie die vertikalen Pfeiltasten nicht wie einen Befehl interpretierenbash
.^[
Darstellung von aussehenescape
, aber sie sind verschiedene Dinge. Bash hätte jede Syntax verwenden können. In der Tat, wenn Sie schreiben\[A
, bash gibt drei Zeichen:^[
(dh Flucht)[
,A
.Das sind ANSI-Escape-Codes .
^[
ist die Notation, mit der Ihre Shell einESC
Byte anzeigt (ASCII-Byte 27). Ihr Beispiel ist also ein ESC-Byte, dem der Text folgt[A
. Wie Sie im Wikipedia-Artikel sehen können, ist^[[
(ESC
gefolgt von[
) ein Control Sequence Introducer oder CSI.CSI A
bedeutet, den Cursor um eine Spalte nach oben zu bewegen.Wenn Sie einen Escape-Code im Terminal sehen möchten, geben Sie STRG + V und dann eine andere Tastenfolge ein. Beispielsweise wird STRG + V gefolgt vom Aufwärtspfeil angezeigt
^[[A
.quelle
Die Befehlsshell, zum Beispiel Bash, ist das Programm, das den Pfeil nach oben in die Aktion "Vorherigen Befehl abrufen" übersetzt. Sie haben keine Befehls-Shell ausgeführt.
quelle
TLDR
Sie führen wahrscheinlich aus,
sh
was die rohen Schlüsselcodes ausgibt, die erzeugt werden, wenn Sie die Aufwärtspfeiltaste drücken.Eine fortgeschrittenere Shell
bash
fängt diese Schlüsselcodes ab und macht etwas damit. ZB den letzten Befehl in seiner Geschichte anzeigen.quelle