Tentando imprimir as teclas de seta para baixo

4

Eu tenho isso:

Eu leio a seta para baixo

abc@abc-ubuntu:~/bashpratice$ read -n 3 key
^[[Babc@abc-ubuntu:~/bashpratice$ 

Eu sou capaz de fazer isso

abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\['
[B
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\[B'
[B

Mas ecoar a tecla apenas imprime espaços

abc@abc-ubuntu:~/bashpratice$ echo $key

abc@abc-ubuntu:~/bashpratice$ 

Por que o eco da chave apenas dá espaços?

    
por abc 24.08.2011 / 17:23

2 respostas

5

O que acontece quando downarrow é digitado em um terminal

Conforme relatado por xxd -p , ao digitar + retornar :

xxd -p
^[[B
1b5b420a

A tecla downarrow leva a uma sequência de 3 caracteres:

  • o primeiro é \x1b (também conhecido como escape, veja man ascii ), ecoado no terminal como ^[ ,
  • o segundo é \x5b , ou seja [ ,
  • o terceiro é \x42 , ou seja, B .

O último caractere, \x0a é apenas o caractere de nova linha.

Então, downarrow é ecoado no terminal como ^[[B . Na realidade, isso corresponde à sequência 1b5b42 hex, que é a que realmente é enviada para o processo de leitura.

Sobre suas experiências

Sua variável key contém a sequência hexagonal 1b5b42 . Verifique com

echo -n "$key" | xxd -p
1b5b42

É claro que grep será capaz de capturar a sequência hexagonal 5b42 (que é [B ) <.

No entanto, quando você envia algo para o terminal, o caractere de escape \x1b é interpretado como o início de alguma seqüência de escape especial. Por exemplo, \x1b[31m é uma sequência reconhecida pela maioria dos terminais e significa "usar cor de primeiro plano vermelha". Verifique você mesmo:

echo -e 'hello \x1b[31myou'

A sequência mudará a cor atual, mas não imprimirá nada. Você também pode verificar isso:

echo -e 'hello \x1b[Byou'

e você verá que a seqüência especial \x1b[B é interpretada pelo terminal como "move o cursor para baixo por um".

É por isso que o echo $key não mostra algo diretamente visível no terminal, exceto algumas linhas em branco.

-
1. Eu não tenho certeza porque grep acontece para imprimir apenas [B , eu tenho algum resultado diferente na minha configuração.

    
por 24.08.2011 / 19:39
2

O terminal não responde aos códigos-chave. Esses são normalmente vistos e interpretados pela aplicação. O aplicativo pode enviar uma seqüência cup (cursor para cima) ou para baixo (geralmente usando a biblioteca ncurses).

    
por 24.08.2011 / 18:45