O que significa uma sequência de bash '\ 033 [999D' e onde é explicada?

19

Eu me deparei com sequências do bash como \033[999De \033[2K\rque são usadas para fazer alguma manipulação em uma impressão em um terminal. Mas o que essas seqüências significam? Onde posso encontrar uma lista / resumo na Web para me ajudar a descobrir o significado dessas seqüências?

Alex
fonte
3
Estas são sequências terminais, não sequências bash. Você precisa consultar a documentação do terminal para determinar sua função.
21414 Chris Down
1
Essas sequências servem para colorir a saída. Verifique: stackoverflow.com/questions/16845699/… e stackoverflow.com/questions/5947742/…
adizere
1
@adizere nem todas as seqüências de escape executam alterações de cor. As seqüências neste Q são para manipulação de linha e movimento do cursor, não para cor.
Casey

Respostas:

32

Consulte este link http://www.termsys.demon.co.uk/vtansi.htm . Como diz Anthon, \033 é o código octal no estilo C para um caractere de escape. Ele [999Dmove o cursor para trás 999 colunas, presumivelmente uma maneira de força bruta de chegar ao início da linha. [2Kapaga a linha atual. \ré um retorno de carro que moverá o cursor de volta ao início da linha atual e é uma sequência de escape no estilo C em vez de uma sequência de controle terminal.

Atualizar

Como outras pessoas apontaram, essas seqüências de controle não têm nada a ver com elas mesmas, bashmas sim o dispositivo / emulador terminal no qual o texto aparece. Era uma vez comum que essas seqüências fossem interpretadas por uma peça de hardware completamente diferente. Originalmente, cada um responderia a conjuntos de códigos completamente diferentes. Para lidar com isso, as bibliotecas termcape terminfoforam usadas para escrever código compatível com vários terminais. O tputcomando é uma interface para a terminfobiblioteca (o termcapsuporte também pode ser compilado) e é uma maneira mais robusta de criar sequências compatíveis.

Dito isto, também há o padrão ANSI X3.64 ou ECMA-48 . Qualquer implementação moderna de terminal usará isso. terminfoe termcapainda são relevantes, pois a implementação pode estar incompleta ou incluir extensões fora do padrão; no entanto, para a maioria dos propósitos, é seguro supor que sequências ANSI comuns funcionem.

O xterm FAQ fornece algumas informações interessantes sobre as diferenças entre os modernos emuladores de terminal (muitos tentam emular- xtermse) e como as xtermseqüências se relacionam com os terminais VT100 mencionados no link acima. Ele também fornece uma lista definitiva de xtermseqüências de controle .

Também é comum usar o console do Linux, é claro, uma lista definitiva de seqüências de controle para ele man console_codes, além de uma comparação com xterm.

Graeme
fonte
O link que você incluiu é apenas a página que eu estava procurando.
21414 Alex
@Alex Glad Eu mesmo encontrei, a maioria das páginas que vi apenas cobrem cores e, de alguma forma, são realmente complexas de ler. Isso estabelece agradável e simples.
Graeme
tenha cuidado para que a ação dos códigos de escape dependa do tipo de terminal (e você pode emular vários tipos de terminal em telas / sistemas operacionais modernos). Você pode usar tputcomandos para ter mais portabilidade, iirc (mas às custas de menos cobertura das especificidades do seu terminal). VT100 (aquele sobre o qual a página fala) é suportado por muitos (mas nem tudo é suportado, acredito ...). Mas sua variável TERM pode estar configurada para outro terminal, e isso pode afetar os efeitos de alguns dos comandos
Olivier Dulac
@ Olivier, correto tputé uma maneira mais robusta. Mas é a compatibilidade com ANSI e não o terminal VT100 específico que agora é bastante onipresente, embora eu imagine que seja possível definir xtermum modo que não os aceite. Vou atualizar com mais algumas informações sobre isso, eu acho.
Graeme
@ Olivier Muitos emuladores de terminal também configuram, TERM=xtermmas não implementam, tudo o que xtermfaz.
Graeme
5

O \033é o caractere de escape e essas seqüências não são específicas do bash, mas são interpretadas pelo terminal (software ou hardware (via rede ou linha serial)) no qual o programa (bash) é executado. Existem muitas dessas seqüências .

O que cada um faz depende do terminal do qual é dependente e também pode depender de qualquer sequência anterior que altere o estado do terminal.

Geralmente são usados ​​para definir cores no prompt do bash , mas não encontrei seus exemplos específicos nessa página.

Anthon
fonte
3

'\ 033 [999D' é engraçado. Alguns terminais implementam menos seqüências de escape, portanto, isso pode ser necessário se nenhum dos '\ 033 [1G', '\ 033 [1; 1H', '\ 033 [1; 1f' ou '\ r' se comportar como eles deveria, mas quem usa uma exibição de texto de mil colunas? Essas sequências têm uma página de manual no Linux: console_codes (4) . bjh21 tem uma lista detalhada de todos os códigos . Dependendo de qual programa analisa '\ 033', a substituição mais clara '\ e' pode estar disponível.

Na verdade, não se pretende que eles sejam usados ​​diretamente - a maneira correta de emitir comandos de controle de terminal é com uma camada de abstração como ncurses - mas eles funcionam igualmente a partir de literais de strings.

user130144
fonte
Bom ponto, eu apenas presumi que \033[999Do backup seria feito nas linhas anteriores. Porém, pode ser apenas o resultado da codificação desonesta;) Você também pode bashinterpretar códigos de escape diretamente, por exemplo:$'\033[999D'
Graeme