Que tipo de sequência são sequências de escape começando com "\ 033]"

18

Eu encontrei muitas seqüências de escape no Bash começando com \033], mas quais são essas sequências e por que elas estão começando \033]?

Sessho
fonte

Respostas:

25

A string é realmente \033[e isso não é tudo.

Depois desse colchete de abertura, vem uma série de números e símbolos. Essa sequência é conhecida como uma sequência de escape e é usada para controlar o cursor e a cor do texto do console, entre outras coisas.

seqüências de escape não imprimíveis devem ser incluídas \[\033[ and \]

Se a sequência de escape estiver controlando a cor do texto, será seguida por um m.

Aqui está uma tabela para as seqüências de cores:

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   

Portanto, se você deseja que o prompt do console seja azul, use a seguinte sequência de escape (no nome do arquivo que estou esquecendo):

\[\033[34m\]

(Observe o m)

Essa sequência de escape não controla apenas a cor, no entanto. Também pode controlar o movimento do cursor. Aqui está uma tabela / lista com os códigos de movimento e como eles funcionam:

  • Posicione o Cursor:

    \033[<L>;<C>H

    Ou

    \033[<L>;<C>f

    coloca o cursor na linha L e na coluna C.

  • Mova o cursor para cima N linhas:

    \033[<N>A
  • Mova o cursor para baixo N linhas:

    \033[<N>B
  • Mova o cursor para frente N colunas:

    \033[<N>C
  • Mova o cursor para trás N colunas:

    \033[<N>D
  • Limpe a tela, vá para (0,0):

    \033[2J
  • Apague para o final da linha:

    \033[K
  • Salve a posição do cursor:

    \033[s
  • Restaurar a posição do cursor:

    \033[u

Lembre-se de que os dois últimos podem não funcionar no emulador de terminal usado. Aparentemente, apenas xterme nxtermuse essas duas sequências.

E exemplo, usando uma dessas seqüências de escape: digamos que quero posicionar meu cursor na linha 3, coluna (caractere) 9. Para isso, eu usaria

\[033\[3;9H]

(Estou assumindo que a coluna 0 é a primeira posição, portanto seria o 8º caractere).

Fonte: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (leia também 6.2)

Leitura mais geral: http://ascii-table.com/ansi-escape-sequences.php

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

O andarilho
fonte
2
considere também linkar para en.wikipedia.org/wiki/ANSI_escape_code
cat
2
Observe que '\ 033' é o caractere ESCAPE em octal, portanto, ele pode ser fornecido em decimal (27) ou hex (0x1B). Há outras maneiras comuns para escrever ESCAPE, por exemplo, '^ [' em shell scripts, "\ E" em bindkey, etc.
jamesqf
1
Observe que várias entradas nessa tabela são enganosas ou imprecisas: negrito, fraco, sublinhado, etc. podem ser configuradas e redefinidas independentemente da cor e também são zeradas por 0 junto com as cores; há todo um conjunto separado de códigos (40-49) para o plano de fundo e 7 alterna o primeiro e o segundo plano; ESC [2Kapaga a linha inteira antes e depois do cursor. Uma fonte muito melhor seria o artigo da Wikipedia, ou você pode ir diretamente para ECMA-48 , seção 8.3.117 SGR - Selecionar renderização gráfica .
Deltab #
A frase "caractere 'm' no final de cada uma das frases a seguir é usada como caractere de parada" " na postagem do cplusplus.com também é um pouco confusa, pois a tabela logo abaixo contém comandos que obviamente não são terminados por um "m". Na verdade, parece ainda mais enganador aqui quando apresentado bem no topo.
Ilkkachu #
1
Tecnicamente, a liderança 0;nas seqüências de cores é desnecessária. Isso apenas torna a cor do plano de fundo o padrão antes de definir o primeiro plano. Você também pode definir o plano de fundo com 4x.
Fund Monica's Lawsuit
17

Eles são comandos de controle para o terminal.

Os terminais eram originalmente dispositivos bastante burros, conectados a uma porta serial, e não aqueles sofisticados softwares da GUI com várias guias com menus que agora temos. Como eles receberam apenas um fluxo de caracteres (bytes), não houve uma separação clara entre dados (o que imprimir na tela) e comandos (como imprimi-los). Em vez disso, os comandos são representados com caracteres de controle especiais.

Os caracteres de controle óbvios são coisas como avanço de linha (nova linha), backspace e bipe de sino, mas comandos mais específicos são dados como sequências de caracteres, começando com o ESCcaractere (código 27 em decimal, 0x1b em hexadecimal ou 033 octal). É frequentemente representado como ^[, ou \033como no seu exemplo.

A sequência ESC [é chamada de CSI, ou introdutor da sequência de controle, e inicia um comando com parâmetros numéricos opcionais, terminando geralmente em uma letra que define o comando principal. A maioria das seqüências de escape comuns se enquadra nessa classe.

As listas dos códigos de escape podem ser encontradas, por exemplo, na console_codes(4)página de manual e na página da Wikipedia para códigos de escape ANSI .

Alguns exemplos:

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

Você pode testar os comandos com, por exemplo, o Bash. Usando a -ebandeira, o echocomando interno aceita \033como uma representação do ESCcaractere.

Por exemplo, isso imprimirá uma saudação colorida no meio da tela e outra normalmente na posição original do cursor:

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

A sequência ESC ]que você mencionou é o OSC ou o Comando do sistema operacional, que é usado principalmente no comando para definir o título da janela xterme outros, por exemplo:

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

Depois, há também ESC ( A(e outras letras) que definem conjuntos de caracteres nacionais em alguns terminais, para um efeito potencialmente hilário .

ilkkachu
fonte
8

O escape seguido por um colchete direito escape]é usado para introduzir um comando do sistema operacional ( OSC).

Está no ECMA-48 e você pode ler um resumo das seqüências de controle usadas pelo xterm nas XTerm Control Sequences , por exemplo, para alterar o título da janela do terminal.

As seqüências de escape podem começar com caracteres diferentes. O C1 (8 bits) caracteres de controlo secção em XTerm sequências de controlo menciona alguns deles: CSI(onde ver como escape[, APC, DCS, PM. A razão para o carácter diferente (segunda) é porque o par (escapar e ]) está associada com um caractere de controle de byte único usado para diferentes tipos de sequência de escape.

Se você ler a especificação, notará que CSIé usado para controles com parâmetros numéricos, enquanto OSCpermite seqüências de caracteres. Além da sintaxe, o comitê que criou esse padrão tinha em mente os usos APCe os PMquais diferiam de DCSe OSC.

Thomas Dickey
fonte
7

Eles são chamados de códigos de escape ANSI e estão listados na página de manual do console_codes . Eles não são específicos do Bash, mas funcionam em qualquer aplicativo de console, desde que o terminal os suporte (a maioria dos emuladores de terminal).

Joey Marianer
fonte
1

As "seqüências de escape" descritas nas outras respostas dependem de qual TIPO terminal você possui (na maioria das vezes "ANSI" ou derivados / similares).

$ echo $TERM  
xterm

Se você deseja escrever scripts que são (um pouco) INDEPENDENTES do termo final, mas ainda usam, por exemplo, cores e outros recursos especiais, dê uma olhada no conteúdo de man terminfo.

por exemplo

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

será impresso .test.com testfundo amarelado e cor vermelha em primeiro plano, e isso funcionará para QUALQUER terminal que seja capaz de usar cores da mesma maneira.

Para ver o que é realmente impresso, insira-o od -t x1zcomo em

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

... onde os valores são mostrados em hexadecimal (devido a "x").

Hannu
fonte