Colchete quadrado entre colchetes colchete A ^ [[A - O que isso significa?

13

Desculpas se isso já tiver sido solicitado, mas eu não tenho idéia de como descobrir isso sozinho - quando procuro "^ [[A" em qualquer mecanismo de pesquisa, ele ignora completamente a parte "^ [[".

Enfim, minha pergunta: às vezes no terminal (em um Mac), quando pressiono as teclas de seta, os caracteres "^ [[A", "^ [[B", "^ [[C" ou "^ [[D" aparecem . Parece que me lembro de ter encontrado isso anos atrás ao usar o (provavelmente) DOS e também acho que ocorreu muito mais frequentemente.

Por que isso acontece e o que eles significam?

Phill
fonte

Respostas:

20

Estes são códigos de escape ANSI . O ^[representa um caractere ESC (escape), o próximo [é um colchete esquerdo real e a letra indica a função do código de escape. A Esc[peça é chamada CSI (Control Sequence Introducer). Portanto, a sequência CSI Asignifica seta para cima ou CUU (CUrsor Up).

De qualquer forma, esse esquema remonta à época do terminal do monitor VT100 (introduzido em 1978). Algumas das seqüências de escape usadas pelo VT100 foram padronizadas pela ANSI no início dos anos 80 e permaneceram em uso comum desde então.

Normalmente, quando você pressiona as teclas de seta, algum programa (como o shell) está ouvindo e pode agir de acordo com elas. Então, quando você pressiona a seta para cima, ela retorna ao seu histórico de comandos. No entanto, se estiver executando um programa que não entende as seqüências de escape das teclas de seta, elas geralmente acabam ecoando de volta para o terminal, como qualquer outra tecla que você possa pressionar. É por isso que às vezes você vê ^[[Ase pressiona a tecla de seta para cima.

Greg Hewgill
fonte
Vale ressaltar também que ^ é a convenção comum do UNIX para mostrar "controle" no terminal. Por exemplo, se você pressionar Ctrl + A e fosse ignorado da mesma maneira, seria mostrado como "^ A". Ctrl + [é na verdade um sinônimo para o caractere de escape. Aliás, o que faz isso acontecer em primeiro lugar; qual software decide imprimir o cursor? É o próprio emulador de terminal ou outra coisa que não conheço?
Muzer
@Muzer, o próprio kernel faz formatação de intercalação de caracteres ecoados. O recurso pode ser desativado comstty -echoctl
O kernel? Interessante, eu não sabia que era tão profundo (embora, em retrospectiva, devesse ter sido óbvio, uma vez que acontece mesmo em estágios muito iniciais da inicialização!).
Muzer