Gibt es einen Grund, warum ich ^ [[A bekomme, wenn ich auf dem Konsolen-Anmeldebildschirm den Pfeil nach oben drücke?

32

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 ^[[AArt von Zeichen etwas?

Bildbeschreibung hier eingeben

Ruban Savvy
quelle

Antworten:

20

Auf diese Weise stellt das Terminal den unformatierten Schlüsselcode der Aufwärtstaste dar, die von der Tastatur an das Terminal gesendet wird. Grundsätzlich würde Ihre Shell normalerweise den Tastendruck abfangen, aber an der Anmeldeaufforderung gibt es nichts zu tun. Das eingegebene Zeichen wird also wie jeder andere Buchstabe (oder jede Zahl oder was auch immer) auf der Konsole ausgegeben.

strugee
quelle
3
@RubanSavvy Ctrl, Alt und Win (in der GNU / Linux-Welt oft als Super bezeichnet) sind Modifikatoren. Wenn Sie sie und eine Taste drücken, wird auf dem Bildschirm etwas anderes gedruckt. Ich vermute, dass die Bildlaufsperre vom Kernel oder einer anderen niedrigen Ebene interpretiert wird, um die Tty-Kontrolle zu gewährleisten, obwohl ich nicht sicher bin. Bild auf und Bild ab werden wahrscheinlich von gettyoder verschluckt login, 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.
Strugee
3
Das obige sollte wahrscheinlich in die Antwort eingearbeitet werden.
Strugee
Weitere
strugee
19

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 Aan die Anwendung sendet a.

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?

Gilles 'SO - hör auf böse zu sein'
quelle
Dies ist eine großartige Antwort, danke Gilles wie immer.
JoshuaRLi
5

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.

  1. Tastaturhardware sendet "Scan-Codes", diese werden jedoch übersetzt und als Zeichen für Anwendungen auf Kommandozeilenebene angezeigt. Die Taste Awird zu einem einzelnen Byte: AWenn die Umschalttaste gedrückt ist (oder die Umschalttaste gedrückt ist), aandernfalls.

  2. 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 sind escape-[-B, C, D.

  3. 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 cursesbewegt die Bibliothek den Cursor), bashfangen ihn jedoch ab und rollen stattdessen durch den Verlauf.

  4. 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 entspricht control-[). Dies wird tatsächlich von der Endgeräteschnittstelle erledigt; sehen stty(1). Infolgedessen wird der Aufwärtspfeil als angezeigt ^[[A. Sie sehen dies in der Befehlszeile, wenn Sie die Eingabetaste catdrü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/ Aobigen 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.

alexis
quelle
3

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önnen readlineSie 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 ^[[Aund ^[[Bauf dem Bildschirm gedruckt. Also, was bedeutet ^[[Adas?

Die Manualpage von bash sagt unter PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

Die Escape-Sequenzen für die Pfeiltasten in ANSI lauten:

  • [ValueACursor nach oben (wo Valuekann leer sein)

  • [ValueBCursor runter (wo Valuekann leer sein)

Chaos
quelle
5
Bei Ihrer Antwort geht es um etwas anderes, da die Anmeldeaufforderung von gedruckt und verarbeitet wird login, was nichts mit der Anmeldeaufforderung zu tun hat bash.
Risto Salminen
1
bashund loginverwenden dieselbe Bibliothek (readline), um Zeilen zu bearbeiten. Der Unterschied ist nur, dass loginSie die vertikalen Pfeiltasten nicht wie einen Befehl interpretieren bash.
Chaos
Ja, das gebe ich zu.
Risto Salminen
Die Bash-Syntax soll wie die ^[Darstellung von aussehen escape, 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.
Alexis
0

Das sind ANSI-Escape-Codes . ^[ist die Notation, mit der Ihre Shell ein ESCByte 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 ^[[( ESCgefolgt von [) ein Control Sequence Introducer oder CSI. CSI Abedeutet, 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.

Yellowantphil
quelle
0

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.

Enzo
quelle
0

TLDR

Sie führen wahrscheinlich aus, shwas die rohen Schlüsselcodes ausgibt, die erzeugt werden, wenn Sie die Aufwärtspfeiltaste drücken.

Eine fortgeschrittenere Shell bashfängt diese Schlüsselcodes ab und macht etwas damit. ZB den letzten Befehl in seiner Geschichte anzeigen.

Schneefall
quelle