Algumas teclas do teclado não correspondem a caracteres reais. Por exemplo, A corresponde ao caractere a
, mas as teclas Acima e F1 não possuem seus próprios caracteres dedicados. Quando essas teclas especiais são pressionadas, em vez de obter um único caractere correspondente à tecla, o terminal converte a tecla em uma seqüência especial de vários caracteres que geralmente começam com o caractere de escape (geralmente exibido como ^[
). Por exemplo, Acima geralmente gera a seqüência ^[[A
(são 3 caracteres de uma chave: escape, [
e A
).
O motivo pelo qual você normalmente não vê ^[[A
é porque a maioria dos aplicativos de console é inteligente o suficiente para converter as seqüências especiais em comandos úteis, em vez de simplesmente fazer o eco para o console. Para fazer isso, eles desativam o eco integrado do terminal e fazem seu próprio processamento de nível inferior. Por exemplo, quando bash
vê ^[[A
, realiz percebe que significa que você pressionou Acima e em vez de fazer eco de ^[[A
de volta, ele faz um monte de coisas para excluir o que você digitou até agora, busque o comando anterior salvo no histórico e imprima isso.
Se você vir ^[[A
quando pressionar Acima , isso normalmente significa que o eco do terminal está ativado e o processo em primeiro plano (aquele no controle do terminal) não está fazendo nenhum processamento mencionado acima. Isso pode ser porque o aplicativo simplesmente ignora o terminal (como a maioria dos comandos não interativos). Observe que, normalmente, o shell coloca o terminal no modo canônico e ativa o eco antes de executar um processo de primeiro plano e restaura suas próprias configurações depois que recupera o controle do terminal após o comando sair.
O eco parece bastante inofensivo. Lembre-se de que, se o comando em execução não ler o terminal, os caracteres gerados pelo teclado provavelmente ficarão na fila de entrada de bash
, portanto, tenha cuidado com o que você digita, pois provavelmente eles serão interpretados como comandos normais. uma vez bash
retoma a leitura do terminal.
¹ Esta é realmente uma simplificação excessiva. Como a sequência específica pode variar de acordo com o tipo de terminal, normalmente há várias camadas de bibliotecas de abstração entre um aplicativo de console e o próprio terminal. Por exemplo, bash
usa a biblioteca readline
para fazer a maior parte de sua entrada.