Respostas:
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 xterm
e nxterm
use 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
[2K
apaga 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 .
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
.
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 ESC
caractere (código 27 em decimal, 0x1b em hexadecimal ou 033 octal). É frequentemente representado como ^[
, ou \033
como 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 -e
bandeira, o echo
comando interno aceita \033
como uma representação do ESC
caractere.
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 xterm
e 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 .
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 OSC
permite seqüências de caracteres. Além da sintaxe, o comitê que criou esse padrão tinha em mente os usos APC
e os PM
quais diferiam de DCS
e OSC
.
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).
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 test
fundo 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 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").