Que tipo de seqüências são seqüências de escape começando com “\ 033]”

11

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 com "\ 033]"?

    
por Sessho 01.10.2016 / 17:03

5 respostas

16

A string é na verdade 3[ e essa não é a coisa toda.

Após esse colchete de abertura, vem uma série de números e símbolos. Essa string é conhecida como uma seqüência de escape e é usada para controlar o cursor e a cor do texto do console, entre outras coisas.

  

As sequências de escape não imprimíveis devem estar entre \[3[ and \]

Se a sequência de escape estiver controlando a cor do texto, ela 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ê quiser que o prompt do seu console seja azul, use a seguinte seqüência de escape (no nome do arquivo que estou esquecendo):

\[3[34m\]

(observe o m )

Esta seqüê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:

    3[<L>;<C>H
    

    Ou

    3[<L>;<C>f
    

    coloca o cursor na linha L e na coluna C.

  • Mova o cursor para cima N linhas:

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

    3[<N>B
    
  • Mover o cursor para frente N colunas:

    3[<N>C
    
  • Mover o cursor para trás N colunas:

    3[<N>D
    
  • Limpe a tela, mova para (0,0):

    3[2J
    
  • Apagar para o final da linha:

    3[K
    
  • Salvar a posição do cursor:

    3[s
    
  • Restaurar posição do cursor:

    3[u
    

Apenas esteja ciente de que os dois últimos podem não funcionar no emulador de terminal que você usa. Aparentemente, apenas xterm e nxterm usam essas duas sequências.

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

\[033\[3;9H]

(Eu estou supondo que a coluna 0 é a primeira posição, então esse seria o 8º caractere).

Fonte: link (leia também 6.2)

Mais leitura geral: link

Wikipédia: link

    
por TheWanderer 01.10.2016 / 17:12
12

Eles são comandos de controle para o terminal.

Os terminais eram originalmente dispositivos bastante estúpidos conectados a uma porta serial, e não aqueles sofisticados programas GUI multi-guias com menus nós agora temos. Como eles recebiam apenas um fluxo de caracteres (bytes), não havia separação clara entre os dados (o que imprimir na tela) e os comandos (como imprimi-los). Em vez disso, os comandos são representados com caracteres especiais de controle.

Os caracteres de controle óbvios são como feed de linha (nova linha), backspace e bip de campainha, mas comandos mais específicos são fornecidos como sequências de caracteres, começando com o caractere ESC (código 27 em decimal, 0x1b em hexadecimal ou 033 octal). Geralmente é representado como ^[ ou 3 , como no seu exemplo.

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

Listas dos cigos de escape podem ser encontradas, e. na página do manual console_codes(4) e na página da Wikipédia para Códigos de escapeANSI .

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, Bash. Usando o sinalizador -e , o comando echo incorporado aceita 3 como uma representação do caractere ESC .

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

echo -e '3[s3[12;30f3[30;46m  Hello!  3[0m3[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 em xterm e outros, por exemplo:

echo -e '3]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 .

    
por ilkkachu 01.10.2016 / 23:35
7

Estes são chamados códigos de escape ANSI , e estão listados no página man para 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 faz).

    
por Joey Marianer 01.10.2016 / 19:46
3

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

Ele está em ECMA-48 , e você pode ler um resumo dos seqüências de controle usadas pelo xterm em Sequências de controle do XTerm , por exemplo, para alterar o título da janela do terminal.

As sequências de escape podem começar com diferentes caracteres. Os Caracteres de controle C1 (8 bits) em XTerm Control Sequences menciona alguns destes: CSI (que você vê como escape [ , APC , DCS , PM A razão para o caractere (segundo) diferente é porque o par (escape e ] ) está associado a um caractere de controle de byte único usado para diferentes tipos de seqüência de escape.

Se você ler a especificação, você notará que CSI é usado para controles com parâmetros numéricos, enquanto OSC permite strings. Além da sintaxe, o comitê que criou esse padrão tinha em mente o uso de APC e PM , que diferiam de DCS e OSC .

    
por Thomas Dickey 03.10.2016 / 01:11
1

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

$ echo $TERM  
xterm

Se você deseja escrever scripts que são (um pouco) INDEPENDENTES do termninal, mas ainda usa, e. cor e outras características especiais, então 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 "."

imprimirá .test. com test com fundo amarelado e cor de primeiro plano vermelha, e isso funcionará para QUALQUER terminal que realmente seja capaz de usar as cores da mesma maneira.

Para ver o que é realmente impresso, canalize-o em od -t x1z como 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").

    
por Hannu 02.10.2016 / 16:06

Tags