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


32

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

Mas quando pressiono as Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Winteclas, não ecoam nenhum caractere.

Qual pode ser a razão por trás?

Tipo ^[[Ade personagem implica alguma coisa?

insira a descrição da imagem aqui

Respostas:


20

É assim que o terminal representa o código de tecla bruto da tecla Up enviado pelo teclado. Basicamente, seu shell normalmente interceptaria o pressionamento de tecla, mas não há nada para fazer isso no prompt de login. Portanto, o caractere digitado é impresso no console como qualquer outra letra (ou número, ou qualquer outra coisa).


3
@RubanSavvy Ctrl, Alt e Win (geralmente chamados de Super no mundo GNU / Linux) são modificadores. Se você pressioná-los e uma tecla, verá algo diferente impresso na tela. Suspeito que o bloqueio de rolagem seja interpretado pelo kernel ou por outro nível baixo, para controle de tty, embora não tenha certeza. As páginas para cima e para baixo provavelmente são engolidas por gettyou login, embora não tenha certeza do motivo. As suposições educadas dizem que a tela impressa é interpretada especialmente pelo kernel por razões históricas. Não tenho 100% de certeza de nenhum, exceto os modificadores.
strugee

3
o acima provavelmente deve ser editado na resposta.
strugee


19

Os teclados enviam eventos para o computador. Um evento diz "código de verificação nnn para baixo" ou "código de verificação nnn para cima". No outro extremo da cadeia, os aplicativos em execução em um terminal esperam entrada na forma de uma sequência de caracteres. (A menos que eles tenham solicitado acesso não processado, como o servidor X.) Quando você pressiona A, o teclado envia as informações “scan code 38 down”. O driver do console consulta 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+ Aenvia o caractere (valor de byte 1), Returnenvia o caractere (Ctrl + M, valor de byte 13) etc. A maioria das teclas de função não possui um caractere correspondente e, em vez disso, envia uma sequência de caracteres que começa com o caractere (escape, byte value 27). Por exemplo, a chave Upé traduzida na sequência de escape ␛[A(três caracteres: escape, colchete aberto, maiúscula A).

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

Se você pressionar Upem um prompt de shell, isso enviará a mesma seqüência de três caracteres para o seu shell. O shell interpreta isso como uma sequência de comandos (normalmente para recuperar o item do histórico anterior). Se você pressionar Ctrl+ V, em seguida, Upem um shell prompt Isso insere a seqüência de escape no prompt: Ctrl+ Vé um comando para inserir o próximo caractere literalmente ao invés de interpretá-lo como um comando, de modo que o personagem não é interpretado como o início de uma seqüência de escape .

Algumas teclas são apenas modificadores e não são transmitidas para aplicativos de terminal. Por exemplo, quando você pressiona Shift, essas informações permanecem no driver do terminal e são levadas em consideração se você pressionar A, para que o driver seja enviado Aao aplicativo em vez de a.

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

Para uma visão semelhante na GUI, consulte O que é a meta-chave do bash?


Esta é uma ótima resposta, obrigado Gilles como sempre.
JoshuaRLi 13/06

5

Não se trata de como as chaves são representadas pelo "terminal" (isto é, o aplicativo emulador de terminal). O que você vê é o código ANSI ( sequência de escape ANSI ) para mover uma linha para cima, mas traduzido para o formato imprimível.

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

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

  3. A mesma sequência de caracteres moveria o cursor para cima em uma linha se enviada (ecoada) para um antigo terminal ANSI físico. 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 cursesbiblioteca move o cursor), mas basho interceptam e rolam o histórico.

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

Finalmente: Control, Alte as outras chaves que você mencionou não mapear para sequências de caracteres. Eles afetam o caractere enviado por outro pressionamento de tecla (como o a/ Aexemplo acima) ou simplesmente não têm mapeamento para o texto. Essas teclas pressionadas podem ser detectadas apenas por programas que escutam eventos do teclado. Eles não podem ser vistos lendo da entrada padrão (ou gravados em um arquivo).


3

Esse comportamento é diferente de shell para shell. A maioria dos shells usa uma biblioteca chamadareadline para editar linhas no prompt. Aqui está uma referência de comando completa para esta biblioteca, portanto, quando um aplicativo estiver em uso, readlinevocê poderá editar e navegar nas linhas com esses comandos.

As teclas de seta vertical 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 personagens^[[A e ^[[Bsão impressos na tela. Então, o que ^[[Asignifica?

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

o seqüências de escape para as teclas de seta no ANSI são:

  • [ValueACursor para cima (onde Valuepode ser vazio)

  • [ValueBCursor para baixo (onde Valuepode ser vazio)


5
Sua resposta é sobre algo diferente, porque o prompt de login é impresso e tratado por login, o que não está relacionado bash.
Risto Salminen

1
bashe loginestá usando a mesma biblioteca (linha de leitura) para editar linhas. A diferença é que loginnão interpreta as teclas de seta vertical como um comando, como bashfaz.
caos

Sim, eu admito isso.
Risto Salminen

A sintaxe do bash deve se parecer com a ^[representação de escape, mas são coisas diferentes. O Bash poderia ter usado qualquer sintaxe. Na verdade, quando você escreve \[A, o bash saídas três personagens: ^[(ie de escape), [, A.
11119 alexis

0

Esses são códigos de escape ANSI . ^[é a notação que seu shell usa para exibir um ESCbyte (ASCII byte 27). Portanto, seu exemplo é um byte ESC seguido pelo texto [A. Como você pode ver no artigo da Wikipedia, ^[[( ESCseguido por [) é um introdutor de sequência de controle ou CSI. CSI Asignifica mover o cursor para cima em uma coluna.

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


0

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


0

TLDR

Você provavelmente está executando o shque gera os códigos de tecla brutos gerados quando você pressiona a tecla de seta Para cima.

Um shell mais avançado como o bashintercepta esses códigos-chave e faz algo com eles. Por exemplo, mostre o último comando em sua história.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.