Existe alguma razão pela qual eu recebo ^ [[A quando eu pressiono a seta para cima na tela de login do console?

27

Sempre que estou no login do console, pressiono a seta para cima intencionalmente para ver os comandos digitados anteriormente. Mas eu vejo isso ^[[A .

Mas quando pressiono Ctrl Alt Imprimir Tela Scroll Lock Interromper Pausa Page Up As teclas Page Down Win não fazem eco aos caracteres.

Qual poderia ser a razão por trás disso?

O ^[[A de caracteres implica em alguma coisa?

    
por Ruban Savvy 04.12.2013 / 07:54

6 respostas

18

Essa é a maneira como o terminal representa o código-chave bruto da tecla para cima enviada pelo teclado. Basicamente, seu shell normalmente interceptaria o pressionamento de tecla, mas não há nada a fazer no prompt de login. Assim, o caractere que você digitou é impresso no console como qualquer outra letra (ou número, ou qualquer outro).

    
por 04.12.2013 / 08:01
16

Os teclados enviam eventos para o computador. Um evento diz “escanear código nnn para baixo” ou “escanear código nnn para cima”. No outro extremo da cadeia, os aplicativos em execução em um terminal esperam uma entrada na forma de uma sequência de caracteres. (A menos que eles tenham solicitado acesso bruto, como o servidor X faz.) Quando você pressiona A , o teclado envia a informação “código de varredura 38 para baixo”. O driver do console pesquisa seu mapa de teclas e o transforma em "caractere a " (se nenhuma tecla modificadora for pressionada ).

Quando você pressiona uma tecla ou combinação de teclas que não resulta em um caractere, as informações precisam ser codificadas em termos de caracteres. Algumas teclas e combinações de teclas têm caracteres de controle correspondentes, por exemplo. Ctrl + A envia o caractere (valor de byte 1), Retorna envia o caractere (Ctrl + M, valor de byte 13), etc. A maioria das teclas de função não tem um caractere correspondente e, em vez disso, envia uma sequência de caracteres que começa com o caractere (escape, valor de byte 27). Por exemplo, a chave Up é traduzida na seqüência de escape ␛[A (três caracteres: escape, colchete, maiúscula A).

O prompt de nome de usuário no console é burro e não entende a maioria das seqüências de escape. Ele não tem a edição de linha e os recursos de histórico aos quais você está acostumado: eles são fornecidos pelo shell e, até você efetuar login, não tem um shell. Por isso, simplesmente exibe a seqüência de escape. Não há glifo para o caractere , portanto, ele é exibido como ^[ . O sinal ^ é tradicionalmente usado como um prefixo para caracteres de controle e escape é ^[ devido ao seu valor de byte: é o valor de byte de [ , menos 64.

Se você pressionar Acima em um prompt do shell, isso enviará a mesma sequência de 3 caracteres para o seu shell. O shell interpreta isso como uma sequência de comandos (normalmente para recuperar o item de histórico anterior). Se você pressionar Ctrl + V então Acima em um prompt do shell, isto insere a seqüência de escape no prompt: Ctrl V é um comando para inserir literalmente o próximo caractere em vez de interpretá-lo como um comando, portanto, o caractere não é interpretado como o início de uma seqüência de escape.

Algumas chaves são apenas modificadores e não são transmitidas para aplicativos do terminal. Por exemplo, quando você pressiona Shift , esta informação fica no driver do terminal, e é levada em consideração se você pressionar A , então o driver envia A para o aplicação em vez de a .

Além disso, algumas teclas de função podem não estar mapeadas em seu console.

Para uma exibição semelhante na GUI, consulte Qual é o meta do bash? chave?

    
por 05.12.2013 / 01:24
4

Não se trata de como as chaves são representadas pelo "terminal" (ou seja, o aplicativo emulador de terminal). O que você está vendo é o código ANSI ( sequência de escape ANSI ) para mover uma linha para cima, mas traduzido em forma de impressão.

  1. O hardware do teclado envia "códigos de verificação", mas eles são traduzidos e apresentados para aplicativos de nível de linha de comando como caracteres. A chave A torna-se um único byte: A se a tecla Shift estiver inativa (ou Shift Lock), a caso contrário.

  2. Em um terminal compatível com ANSI, as teclas de seta não enviam um único caractere (não há códigos para as setas no conjunto de caracteres ASCII), mas uma "sequência de escape" de três caracteres: escape-[-A . As outras três teclas de seta são escape-[-B, C, D .

  3. A mesma seqüência de caracteres moveria o cursor para cima em uma linha se enviada (ecoada) para um terminal ANSI físico antigo. Muitos programas, incluindo emuladores de terminal, reconhecem essas seqüências de caracteres e fazem algo apropriado: emuladores de terminal movem o cursor para cima (é assim que a biblioteca curses move o cursor), mas bash interceptará e rolará o histórico .

  4. Para evitar que o cursor fique todo o lugar em programas que não têm nenhum uso para mover o cursor pela tela, você frequentemente verá ESC na entrada do teclado exibida como a sequência imprimível ^[ (porque escape corresponde a control-[ ). Isso é realmente manipulado pela interface do dispositivo terminal; veja stty(1) . Como resultado, a seta para cima será exibida como ^[[A . Você verá isso a partir da linha de comando se digitar cat , pressionar a tecla return e pressionar algumas teclas de seta. Isso também é o que você viu na tela de login do console.

Finalmente: Controle , Alt , e as outras chaves que você mencionou não mapeiam para seqüências de caracteres. Eles afetam o caractere enviado por outro pressionamento de tecla (como o a / A exemplo acima) ou simplesmente não possuem mapeamento para texto. Tais pressionamentos de tecla só podem ser detectados por programas que escutam eventos de teclado. Eles não podem ser vistos pela leitura da entrada padrão (ou ser gravados em um arquivo).

    
por 07.12.2013 / 01:57
3

Este comportamento é diferente de shell para shell. A maioria dos shells usa uma biblioteca chamada readline para editar linhas no prompt. Aqui é uma referência de comando completa para esta biblioteca, portanto, quando um aplicativo estiver usando readline você pode editar e navegar pelas linhas com estes comandos.

As teclas de seta verticais são configuradas na linha de leitura para navegar no histórico de comandos. E no prompt de login não há histórico de comandos. É por isso que os caracteres ^[[A e ^[[B estão impressos na tela. Então, o que significa ^[[A ?

A página de manual do bash diz em PROMPTING :

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

As sequências de escape para as teclas de seta em ANSI são:

  • [ValueA Cursor para cima (onde Value pode ser vazio)

  • [ValueB Cursor inativo (onde Value pode ser vazio)

por 04.12.2013 / 08:47
0

Esses são códigos de escape ANSI . ^[ é a notação que seu shell usa para exibir um ESC byte (byte ASCII 27). Portanto, seu exemplo é um byte ESC seguido pelo texto [A . Como você pode ver no artigo da Wikipédia, ^[[ ( ESC seguido por [ ) é um Control Sequence Introducer ou CSI. CSI A significa mover o cursor para cima em uma coluna.

Se você quiser ver um código de escape no terminal, digite CTRL + V e, em seguida, outra seqüência de teclas. Por exemplo, CTRL + V seguido pela seta para cima mostra ^[[A .

    
por 29.04.2015 / 18:06
0

O shell de comando, por exemplo Bash, é o programa que traduz a seta para cima na ação "recuperar o comando anterior". Você não tem um shell de comando em execução.

    
por 04.10.2018 / 15:39