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 ^[[A
tipo de personajes implica algo?
getty
ologin
, 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.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
A
a la aplicación en lugar dea
.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?
fuente
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.
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:
A
si la tecla Shift está presionada (o Shift Lock), de loa
contrario.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 sonescape-[-B, C, D
.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
curses
biblioteca mueve el cursor), perobash
lo interceptarán y desplazarán el historial.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 acontrol-[
). Esto es realmente manejado por la interfaz del dispositivo terminal; verstty(1)
. Como resultado, la flecha hacia arriba aparecerá como^[[A
. Verá esto desde la línea de comando si escribecat
, 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
/A
ejemplo 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).fuente
Este comportamiento es diferente de un shell a otro. La mayoría de los shells usan una biblioteca llamada
readline
para editar líneas en el indicador. Aquí hay una referencia completa de comandos para esta biblioteca, por lo que cuando una aplicación está usandoreadline
puede 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
^[[A
y^[[B
se imprimen en la pantalla. Entonces, ¿qué^[[A
significa?La página del manual de bash dice debajo
PROMPTING
:Las secuencias de escape para las teclas de flecha en ANSI son:
[ValueA
Cursor arriba (dondeValue
puede estar vacío)[ValueB
Cursor abajo (dondeValue
puede estar vacío)fuente
login
, lo que no está relacionadobash
.bash
ylogin
están usando la misma biblioteca (readline) para editar líneas. La diferencia es quelogin
no interpreta las teclas de flecha vertical como un comando, como lobash
hace.^[
representación deescape
, 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
.Esos son los códigos de escape ANSI .
^[
es la notación que utiliza su shell para mostrar unESC
byte (ASCII byte 27). Entonces, su ejemplo es un byte ESC seguido del texto[A
. Como puede ver en el artículo de Wikipedia,^[[
(ESC
seguido de[
) es un Introductor de secuencia de control o CSI.CSI A
significa 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
.fuente
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.
fuente
TLDR
Probablemente esté ejecutando lo
sh
que genera los códigos de teclas sin procesar generados cuando presiona la tecla de flecha hacia arriba.Un shell más avanzado como
bash
intercepta estos códigos clave y hace algo con ellos. Por ejemplo, mostrar el último comando en su historia.fuente