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 ^[[A
de personagem implica alguma coisa?
getty
oulogin
, 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.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
A
ao aplicativo em vez dea
.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?
fonte
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.
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:
A
se a tecla Shift estiver pressionada (ou Shift Lock),a
caso contrário.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ãoescape-[-B, C, D
.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
curses
biblioteca move o cursor), masbash
o interceptam e rolam o histórico.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 acontrol-[
). Isso é realmente tratado pela interface do dispositivo terminal; vejastty(1)
. Como resultado, a seta para cima será exibida como^[[A
. Você verá isso na linha de comando, se digitarcat
, 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
/A
exemplo 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).fonte
Esse comportamento é diferente de shell para shell. A maioria dos shells usa uma biblioteca chamada
readline
para editar linhas no prompt. Aqui está uma referência de comando completa para esta biblioteca, portanto, quando um aplicativo estiver em uso,readline
você 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^[[B
são impressos na tela. Então, o que^[[A
significa?A página de manual do bash diz em
PROMPTING
:o seqüências de escape para as teclas de seta no ANSI são:
[ValueA
Cursor para cima (ondeValue
pode ser vazio)[ValueB
Cursor para baixo (ondeValue
pode ser vazio)fonte
login
, o que não está relacionadobash
.bash
elogin
está usando a mesma biblioteca (linha de leitura) para editar linhas. A diferença é quelogin
não interpreta as teclas de seta vertical como um comando, comobash
faz.^[
representação deescape
, 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
.Esses são códigos de escape ANSI .
^[
é a notação que seu shell usa para exibir umESC
byte (ASCII byte 27). Portanto, seu exemplo é um byte ESC seguido pelo texto[A
. Como você pode ver no artigo da Wikipedia,^[[
(ESC
seguido por[
) é um introdutor de sequência de controle ou CSI.CSI A
significa 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
.fonte
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.
fonte
TLDR
Você provavelmente está executando o
sh
que gera os códigos de tecla brutos gerados quando você pressiona a tecla de seta Para cima.Um shell mais avançado como o
bash
intercepta esses códigos-chave e faz algo com eles. Por exemplo, mostre o último comando em sua história.fonte