Emuladores de terminal, como gnome-terminal
("Terminal" no Ubuntu), mas também xterm
e urxvt
são denominados "emuladores" porque reproduzem o comportamento de terminais mais antigos que eram a única exibição de um computador. Esses terminais se comunicavam com o computador com um protocolo baseado em texto e foram projetados inicialmente para receber apenas texto. Rapidamente, mais controle era necessário: como apagar uma linha? Use cores? Ou mude a posição do cursor?
Fonte: A arte da usabilidade do Unix - interfaces de linha de comando
As seqüências de escape foram projetadas para cada terminal para fazer essas coisas. Eles são chamados de escape porque começam com o código de escape ASCII: 33
. Não há como imprimir tal personagem diretamente, o que o torna adequado para essas sequências. Quando ainda queremos exibir este characted, ^[[
é usado, e é isso que vou usar nas minhas explicações.
Quando o terminal recebeu ^[[A
, isso não significou "print ^ [[A", mas "o usuário pressionou a tecla de seta para cima". "A" aqui é totalmente arbitrário: acontece que é a letra que todos concordam, porque é isso que o DEC VT-52 e seu sucessor usaram o popular terminal VT-100.
Fonte: DEC VT-52 - Manual de Manutenção de 1976
Ainda é assim que os emuladores de terminal funcionam hoje: dependendo da variável $TERM
, um banco de dados chamado terminfo
é responsável por dizer quais códigos devem ser enviados ao shell (bash, sh, zsh ...), que é então responsável por compreendê-los e reagir a eles.
Agora, o código para Shift + acima é ^[[1;2A
: o emulador de terminal envia este código para o shell, que tenta interpretar ^[[1;2
mas não exibe nada porque não sabe sobre essa seqüência de escape. Mas A
é deixado e exibido.