¿Qué tipo de secuencias son secuencias de escape que comienzan con "\ 033]"

19

Encontré muchas secuencias de escape en Bash \033], pero ¿cuáles son estas secuencias y por qué están comenzando \033]?

Sessho
fuente

Respuestas:

25

La cadena es en realidad \033[y eso no es todo.

Después de ese paréntesis de apertura viene una serie de números y símbolos. Esta cadena se conoce como una secuencia de escape y se usa para controlar el cursor de la consola y el color del texto, entre otras cosas.

las secuencias de escape sin impresión tienen que estar encerradas en \[\033[ and \]

Si la secuencia de escape controla el color del texto, entonces será seguido por un m.

Aquí hay una tabla para las secuencias de colores:

Black       0;30     Dark Gray     1;30  
Blue        0;34     Light Blue    1;34  
Green       0;32     Light Green   1;32  
Cyan        0;36     Light Cyan    1;36  
Red         0;31     Light Red     1;31  
Purple      0;35     Light Purple  1;35  
Brown       0;33     Yellow        1;33  
Light Gray  0;37     White         1;37   

Entonces, si desea que el indicador de la consola sea azul, usaría la siguiente secuencia de escape (en el nombre de archivo que estoy olvidando):

\[\033[34m\]

(Observe el m)

Sin embargo, esta secuencia de escape no solo controla el color. También puede controlar el movimiento del cursor. Aquí hay una tabla / lista con los códigos de movimiento y cómo funcionan:

  • Posiciona el cursor:

    \033[<L>;<C>H

    O

    \033[<L>;<C>f

    coloca el cursor en la línea L y la columna C.

  • Mueva el cursor hacia arriba N líneas:

    \033[<N>A
  • Mueva el cursor hacia abajo N líneas:

    \033[<N>B
  • Mueva el cursor hacia adelante N columnas:

    \033[<N>C
  • Mueva el cursor hacia atrás N columnas:

    \033[<N>D
  • Despeje la pantalla, vaya a (0,0):

    \033[2J
  • Borrar hasta el final de la línea:

    \033[K
  • Guardar posición del cursor:

    \033[s
  • Restaurar la posición del cursor:

    \033[u

Solo tenga en cuenta que los dos últimos pueden no funcionar en el emulador de terminal que usa. Aparentemente, solo xtermy nxtermusa esas dos secuencias.

Y ejemplo usando una de estas secuencias de escape: digamos que quiero colocar mi cursor en la línea 3, columna (carácter) 9. Para eso, usaría

\[033\[3;9H]

(Supongo que la columna 0 es la primera posición, por lo que sería el octavo carácter).

Fuente: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (también lea 6.2)

Lectura más general: http://ascii-table.com/ansi-escape-sequences.php

Wikipedia: https://en.wikipedia.org/wiki/ANSI_escape_code

El vagabundo
fuente
2
considere también vincular a en.wikipedia.org/wiki/ANSI_escape_code
cat
2
Tenga en cuenta que '\ 033' es el carácter ESCAPE en octal, por lo que podría darse en decimal (27) o hexadecimal (0x1B). Hay otras formas comunes de escribir ESCAPE, por ejemplo, '^ [' en scripts de shell, "\ e" en bindkey, etc.
jamesqf
1
Tenga en cuenta que una serie de entradas en esa tabla son engañosas o inexactas: negrita, tenue, subrayado, etc. se pueden configurar y restablecer independientemente del color, y también se restablecen en 0 junto con los colores; hay un conjunto completamente separado de códigos (40–49) para el fondo, y 7 en cambio intercambia el primer plano y el fondo; ESC [2Kborra toda la línea antes y después del cursor. Una fuente mucho mejor sería el artículo de Wikipedia, o podría ir directamente a ECMA-48 , sección 8.3.117 SGR - Seleccionar representación gráfica .
deltab
La frase "carácter 'm' al final de cada una de las siguientes oraciones se usa como un carácter de detención" en la publicación de cplusplus.com también es un poco confusa, ya que la tabla a continuación contiene comandos que obviamente no están terminados por un "metro". En realidad, parece aún más engañoso aquí cuando se presenta en la parte superior.
ilkkachu
1
Técnicamente, el liderazgo 0;en las secuencias de color es innecesario. Eso solo hace que el color de fondo sea el predeterminado antes de configurar el primer plano. También puede establecer el fondo con 4x.
Financia la demanda de Mónica el
17

Son comandos de control para la terminal.

Los terminales eran originalmente dispositivos bastante tontos conectados a un puerto serie, y no esos sofisticados softwares GUI de múltiples pestañas con menús que ahora tenemos. Como solo recibieron una secuencia de caracteres (bytes), no hubo una separación clara entre los datos (qué imprimir en la pantalla) y los comandos (cómo imprimirlos). En cambio, los comandos se representan con caracteres de control especiales.

Los caracteres de control obvios son cosas como salto de línea (nueva línea), retroceso y pitido de campana, pero se dan comandos más específicos como secuencias de caracteres, comenzando con el ESCcarácter (código 27 en decimal, 0x1b en hexadecimal o 033 octal). A menudo se representa como ^[, o \033como en su ejemplo.

La secuencia ESC [se llama CSI, o introductor de secuencia de control, e inicia un comando con parámetros numéricos opcionales, que generalmente termina en una letra que define el comando principal. La mayoría de las secuencias de escape comunes caen en esta clase.

Las listas de los códigos de escape se pueden encontrar, por ejemplo, en la console_codes(4)página del manual y en la página de Wikipedia para los códigos de escape ANSI .

Algunos ejemplos:

ESC [ 4 A             move cursor 4 lines up (4 can be any number)
ESC [ 5 B             move cursor 5 lines down
ESC [ 2 K             erase current line 
ESC [ 30;46 m         set black text (30) on cyan background (46)
ESC [ 0 m             reset color and attributes

Puede probar los comandos con, por ejemplo, Bash. Usando la -ebandera, el echocomando incorporado acepta \033como una representación del ESCpersonaje.

Por ejemplo, esto imprimirá un saludo en color en el medio de la pantalla y otro normalmente en la posición original del cursor:

echo -e '\033[s\033[12;30f\033[30;46m  Hello!  \033[0m\033[uhello'

La secuencia ESC ]que mencionó es el OSC o el comando del sistema operativo, que se utiliza principalmente en el comando para establecer el título de la ventana xtermy otros, por ejemplo:

echo -e '\033]0;new window title\a'

Luego también hay ESC ( A(y otras letras) que establecen conjuntos de caracteres nacionales en algunas terminales, con un efecto potencialmente hilarante .

ilkkachu
fuente
8

Escape seguido de un corchete derecho escape]se utiliza para introducir un comando del sistema operativo ( OSC).

Está en ECMA-48 , y puede leer un resumen de las secuencias de control utilizadas por xterm en Secuencias de control de XTerm , por ejemplo, para cambiar el título de la ventana de terminal.

Las secuencias de escape pueden comenzar con diferentes personajes. El C1 (8 bits) Caracteres de Control de la sección en XTerm secuencias de control menciona algunos de los que: CSI(que se ve como escape[, APC, DCS, PM. La razón del carácter diferente (segundo) se debe a que el par (escapar y ]) se asocia con una carácter de control de un solo byte utilizado para diferentes tipos de secuencia de escape.

Si lee la especificación, notará que CSIse usa para controles con parámetros numéricos, mientras que OSCpermite cadenas. Más allá de la sintaxis, el comité que creó este estándar tenía en mente los usos para APCy PMque diferían de DCSy OSC.

Thomas Dickey
fuente
1

Las "secuencias de escape" descritas en las otras respuestas dependen del tipo de terminal que tenga (con mayor frecuencia "ANSI" o derivados / similares).

$ echo $TERM  
xterm

Si desea escribir guiones que sean (algo) INDEPENDIENTES del término, pero que aún utilicen, por ejemplo, color y otras características especiales, eche un vistazo al contenido de man terminfo.

p.ej

$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."

se imprimirá .test.con testun fondo amarillento y un color de primer plano rojo, y esto funcionará para CUALQUIER terminal que sea capaz de usar colores de la misma manera.

Para ver qué se imprime realmente, póngalo od -t x1zcomo en

$ tput sgr0 | od -t x1z  
0000000 1b 28 42 1b 5b 6d                                >.(B.[m<  
0000006

... donde los valores se muestran en hexadecimal (debido a "x").

Hannu
fuente