¿Qué significa una secuencia bash '\ 033 [999D' 'y dónde se explica?

19

Me he encontrado con secuencias de bash como \033[999Dy \033[2K\rque se utilizan para hacer alguna manipulación en una impresión en un terminal. Pero, ¿qué significan estas secuencias? ¿Dónde puedo encontrar una lista / resumen en la web para ayudarme a descubrir el significado de estas secuencias?

Alex
fuente
3
Estas son secuencias terminales, no secuencias de bash. Debe consultar la documentación de su terminal para determinar su función.
Chris Down
1
Esas secuencias sirven para colorear la salida. Consulte: stackoverflow.com/questions/16845699/… y stackoverflow.com/questions/5947742/…
adizere
1
@adizere no todas las secuencias de escape realizan cambios de color. Las secuencias en esta Q son para la manipulación de líneas y el movimiento del cursor, no para el color.
casey

Respuestas:

32

Ver este enlace http://www.termsys.demon.co.uk/vtansi.htm . Como dice Anthon, \033 es el código octal de estilo C para un personaje de escape. La [999Dmueve el cursor hacia atrás 999 columnas, presumiblemente una forma de fuerza bruta de llegar al inicio de la línea. [2Kborra la línea actual. \res un retorno de carro que moverá el cursor al inicio de la línea actual y es una secuencia de escape de estilo C en lugar de una secuencia de control de terminal.

Actualizar

Como han señalado otras personas, estas secuencias de control no son nada que hacer bash, sino el dispositivo terminal / emulador en el que aparece el texto. Érase una vez que era común que estas secuencias fueran interpretadas por una pieza de hardware completamente diferente. Originalmente, cada uno respondería a conjuntos de códigos completamente diferentes. Para lidiar con esto, las bibliotecas termcapy se terminfoutilizan para escribir código compatible con múltiples terminales. El tputcomando es una interfaz para la terminfobiblioteca ( termcaptambién se puede compilar el soporte) y es una forma más sólida de crear secuencias compatibles.

Dicho esto, también existe el estándar ANSI X3.64 o ECMA-48 . Cualquier implementación de terminal moderna usará esto. terminfoy termcapsiguen siendo relevantes ya que la implementación puede estar incompleta o incluir extensiones no estándar, sin embargo, para la mayoría de los propósitos, es seguro asumir que las secuencias ANSI comunes funcionarán.

Las xterm preguntas frecuentes proporcionan información interesante sobre las diferencias entre los emuladores de terminal modernos (muchos solo intentan emularse xterm) y cómo las xtermsecuencias se relacionan con los terminales VT100 mencionados en el enlace anterior. También proporciona una lista definitiva de xtermsecuencias de control .

Por supuesto, también se usa comúnmente la consola Linux, en la que se puede encontrar una lista definitiva de secuencias de control man console_codes, junto con una comparación con xterm.

Graeme
fuente
El enlace que incluyó es solo la página que estaba buscando.
Alex
@Alex Me alegro de haberlo encontrado yo mismo, la mayoría de las páginas que he visto solo cubren colores y de alguna manera son realmente complejas de leer. Esto lo presenta agradable y simple.
Graeme
tenga cuidado de que la acción de los códigos de escape dependa del tipo de terminal (y puede emular varios tipos de terminal en pantallas / SO modernas). En su tputlugar, puede usar comandos para tener más portabilidad, iirc (pero a expensas de una menor cobertura de los detalles de su terminal). VT100 (del que habla la página) es compatible con muchos (pero no todo es compatible, creo ...). Pero su variable TERM puede estar configurada en algún otro terminal, y esto podría afectar los efectos de algunos de los comandos
Olivier Dulac
@ Olivier, correcto tputes una forma más robusta. Pero es la compatibilidad ANSI en lugar del terminal VT100 específico lo que ahora es bastante ubicuo, aunque imagino que es posible establecerlo xtermen un modo que no los acepte. Voy a actualizar con más información sobre esto, creo.
Graeme
@Olivier Muchos emuladores de terminal también configuran TERM=xtermpero no implementan todo lo que xtermhace.
Graeme
5

El \033es el carácter de escape, y esas secuencias no son específicas de bash sino que son interpretadas por el terminal (software o hardware (a través de la red o línea serial)) en el que se ejecuta el programa (bash). Hay muchas secuencias de este tipo .

Lo que cada uno hace depende del terminal del que depende y también puede depender de cualquier secuencia previa que altere el estado del terminal.

A menudo se usan para establecer colores en el indicador de bash , pero no encontré sus ejemplos particulares en esa página.

Anthon
fuente
3

'\ 033 [999D' es gracioso. Algunos terminales implementan menos secuencias de escape, por lo que esto podría ser necesario si ninguno de '\ 033 [1G', '\ 033 [1; 1H', '\ 033 [1; 1f' o '\ r' se comportan como ellos debería, pero ¿quién usa una pantalla de texto de mil columnas? Estas secuencias tienen una página de manual en Linux: console_codes (4) . bjh21 tiene una lista detallada de todos los códigos . Dependiendo de qué programa analiza '\ 033', la sustitución más clara '\ e' podría estar disponible.

Realmente no se pretende que se usen directamente, la forma correcta de emitir comandos de control de terminal es con una capa de abstracción como ncurses, pero funcionan igual de bien desde los literales de cadena.

usuario130144
fuente
Buen punto, simplemente asumí que \033[999Dsería una copia de seguridad de las líneas anteriores. Sin embargo, puede ser el resultado de una codificación dudosa;) También puede bashinterpretar los códigos de escape directamente, por ejemplo$'\033[999D'
Graeme