¿Hay alguna razón por la que obtengo ^ [[A cuando presiono la flecha hacia arriba en la pantalla de inicio de sesión de la consola?

32

Cada vez que estoy en el inicio de sesión de la consola, presiono la upflecha intencionalmente para ver los comandos escritos anteriormente. Pero veo esto ^[[A.

Pero cuando presiono las Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Winteclas no se hace eco de ningún carácter.

¿Cuál podría ser la razón detrás?

¿El ^[[Atipo de personajes implica algo?

ingrese la descripción de la imagen aquí

Ruban Savvy
fuente

Respuestas:

20

Esa es la forma en que el terminal representa el código de clave sin formato de la tecla Arriba que le envía el teclado. Básicamente, su shell normalmente interceptaría la pulsación de tecla, pero no hay nada que hacer en el indicador de inicio de sesión. Entonces, el carácter que escribió se imprime en la consola como cualquier otra letra (o número, o lo que sea).

Strugee
fuente
3
@RubanSavvy Ctrl, Alt y Win (a menudo llamados Super en el mundo GNU / Linux) son modificadores. Si los presiona y una tecla, verá algo diferente impreso en la pantalla. El bloqueo de desplazamiento que sospecho es interpretado por el kernel u otra cosa de bajo nivel, para el control de tty, aunque no estoy seguro. Las páginas arriba y abajo probablemente son tragadas por gettyo login, aunque no estoy seguro de por qué. La adivinación educada dice que la pantalla de impresión es interpretada especialmente por el núcleo por razones históricas. Sin embargo, no estoy 100% seguro de ninguno, excepto los modificadores.
Strugee
3
lo anterior probablemente debería ser editado en la respuesta.
Strugee
discusión relacionada en el chat: chat.stackexchange.com/transcript/message/12481097#12481097
strugee
19

Los teclados envían eventos a la computadora. Un evento dice "escanear código nnn abajo" o "escanear código nnn arriba". En el otro extremo de la cadena, las aplicaciones que se ejecutan en un terminal esperan una entrada en forma de secuencia de caracteres. (A menos que hayan solicitado acceso sin procesar, como lo hace el servidor X). Cuando presiona A, el teclado envía la información "código de escaneo 38 hacia abajo". El controlador de la consola busca su mapa de teclas y lo transforma en "carácter a" (si no se presiona ninguna tecla modificadora).

Cuando presiona una tecla o combinación de teclas que no da como resultado un carácter, la información debe codificarse en términos de caracteres. Algunas teclas y combinaciones de teclas tienen los caracteres de control correspondientes, por ejemplo, Ctrl+ Aenvía el carácter (valor de byte 1), Returnenvía el carácter (Ctrl + M, valor de byte 13), etc. La mayoría de las teclas de función no tienen un carácter correspondiente y en su lugar envían Una secuencia de caracteres que comienza con el carácter (escape, byte value 27). Por ejemplo, la clave Upse traduce a la secuencia de escape ␛[A(tres caracteres: escape, corchete abierto, A mayúscula).

El indicador de nombre de usuario en la consola es tonto y no comprende la mayoría de las secuencias de escape. No tiene las características de edición de línea e historial a las que está acostumbrado: las proporciona el shell, y hasta que inicie sesión, no tiene un shell. Entonces simplemente muestra la secuencia de escape. No hay glifo para el personaje, por lo que se muestra como ^[. El ^signo se usa tradicionalmente como prefijo para los caracteres de control, y escape se ^[debe a su valor de byte: es el valor de byte [, menos 64.

Si presiona Upen un indicador de shell, esto envía la misma secuencia de 3 caracteres a su shell. El intérprete interpreta esto como una secuencia de comando (generalmente para recuperar el elemento del historial anterior). Si presiona Ctrl+ y Vluego Upen un indicador de comandos de shell, esto inserta la secuencia de escape en el indicador: Ctrl+ Ves un comando para insertar el siguiente carácter literalmente en lugar de interpretarlo como un comando, por lo que el carácter no se interpreta como el inicio de una secuencia de escape .

Algunas teclas son solo modificadores y no se transmiten a las aplicaciones de terminal. Por ejemplo, cuando presiona Shift, esta información permanece en el controlador del terminal y se tiene en cuenta si presiona A, por lo que el controlador envía Aa la aplicación en lugar de a.

Además, algunas teclas de función pueden no estar asignadas en su consola.

Para una vista similar en la GUI, vea ¿Qué es la meta clave de bash?

Gilles 'SO- deja de ser malvado'
fuente
Esta es una gran respuesta, gracias Gilles como siempre.
JoshuaRLi
5

No se trata de cómo las teclas están representadas por el "terminal" (es decir, la aplicación del emulador de terminal). Lo que está viendo es el código ANSI ( secuencia de escape ANSI ) para moverse hacia arriba una línea, pero traducido a forma imprimible.

  1. El hardware del teclado envía "códigos de escaneo", pero se traducen y presentan a las aplicaciones de nivel de línea de comandos como caracteres. La tecla se Aconvierte en un solo byte: Asi la tecla Shift está presionada (o Shift Lock), de lo acontrario.

  2. En un terminal compatible con ANSI, las teclas de flecha no envían un solo carácter (no hay códigos de flechas en el conjunto de caracteres ASCII), sino una "secuencia de escape" 3 caracteres: escape-[-A. Las otras tres teclas de flecha son escape-[-B, C, D.

  3. La misma secuencia de caracteres movería el cursor hacia arriba una línea si se envía (se repite) a un antiguo terminal ANSI físico. Muchos programas, incluidos los emuladores de terminal, reconocen estas secuencias de caracteres y hacen algo apropiado: los emuladores de terminal moverán el cursor hacia arriba (así es como la cursesbiblioteca mueve el cursor), pero bashlo interceptarán y desplazarán el historial.

  4. Para evitar que el cursor termine por todos lados en programas que no sirven para mover el cursor por la pantalla, a menudo verá ESC en la entrada del teclado que se muestra como la secuencia imprimible ^[(porque el escape corresponde a control-[). Esto es realmente manejado por la interfaz del dispositivo terminal; ver stty(1). Como resultado, la flecha hacia arriba aparecerá como ^[[A. Verá esto desde la línea de comando si escribe cat, pulsa Intro y presiona algunas teclas de flecha. Esto también es lo que viste en la pantalla de inicio de sesión de la consola.

Por último: Control, Alty las otras teclas que usted ha mencionado no se asignan a las secuencias de caracteres. Afectan el carácter enviado por otra pulsación de tecla (como el a/ Aejemplo anterior), o simplemente no tienen asignación a texto. Tales pulsaciones de teclas solo pueden ser detectadas por programas que escuchan eventos de teclado. No se pueden ver leyendo desde la entrada estándar (o se pueden escribir en un archivo).

alexis
fuente
3

Este comportamiento es diferente de un shell a otro. La mayoría de los shells usan una biblioteca llamada readlinepara editar líneas en el indicador. Aquí hay una referencia completa de comandos para esta biblioteca, por lo que cuando una aplicación está usando readlinepuede editar y navegar las líneas con estos comandos.

Las teclas de flecha vertical están configuradas en readline para navegar por el historial de comandos. Y en la solicitud de inicio de sesión no hay historial de comandos. Es por eso que los personajes ^[[Ay ^[[Bse imprimen en la pantalla. Entonces, ¿qué ^[[Asignifica?

La página del manual de bash dice debajo PROMPTING:

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

Las secuencias de escape para las teclas de flecha en ANSI son:

  • [ValueACursor arriba (donde Valuepuede estar vacío)

  • [ValueBCursor abajo (donde Valuepuede estar vacío)

caos
fuente
55
Su respuesta es sobre algo diferente, porque la solicitud de inicio de sesión es impresa y manejada por login, lo que no está relacionado bash.
Risto Salminen
1
bashy loginestán usando la misma biblioteca (readline) para editar líneas. La diferencia es que loginno interpreta las teclas de flecha vertical como un comando, como lo bashhace.
caos
Sí, lo admito.
Risto Salminen
La sintaxis de bash se parece a la ^[representación de escape, pero son cosas diferentes. Bash podría haber usado cualquier sintaxis. De hecho, cuando se escribe \[A, golpe del da salida a tres personajes: ^[(es decir, de escape), [, A.
alexis
0

Esos son los códigos de escape ANSI . ^[es la notación que utiliza su shell para mostrar un ESCbyte (ASCII byte 27). Entonces, su ejemplo es un byte ESC seguido del texto [A. Como puede ver en el artículo de Wikipedia, ^[[( ESCseguido de [) es un Introductor de secuencia de control o CSI. CSI Asignifica mover el cursor hacia arriba una columna.

Si desea ver un código de escape en la terminal, escriba CTRL + V y luego otra secuencia de teclas. Por ejemplo, CTRL + V seguido de la flecha hacia arriba muestra ^[[A.

yellowantphil
fuente
0

El shell de comandos, por ejemplo Bash, es el programa que traduce la flecha hacia arriba en la acción "recuperar comando anterior". No tiene un shell de comandos ejecutándose.

Enzo
fuente
0

TLDR

Probablemente esté ejecutando lo shque genera los códigos de teclas sin procesar generados cuando presiona la tecla de flecha hacia arriba.

Un shell más avanzado como bashintercepta estos códigos clave y hace algo con ellos. Por ejemplo, mostrar el último comando en su historia.

Snowcrash
fuente