Entrada de linha de comando enquanto um script em execução exibe símbolos estranhos

8

Se eu usar o bash shell cli e executar algum programa que não retorna imediatamente, então eu introduzo algumas letras (basicamente digitando o próximo comando antes de perceber que o anterior não foi concluído) e a entrada sempre se parece com isso ( especialmente ao usar as teclas de seta para cima e para baixo:)

]]A^ or ]]B^

E eu me pergunto, esse tipo de entrada prematura é "prejudicial" de qualquer maneira, ou o que a string retornada significa?

    
por U2ros 11.10.2012 / 20:42

2 respostas

8

Essas cadeias são a representação bruta dos caracteres especiais que você digitou (como home, end, arrows, tab etc ...).
Seu efeito prejudicial é controlado pelo comando que você está executando, se ele está recebendo entrada do terminal, esses caracteres farão parte de sua entrada. Se não receber informações do terminal, isso não deve causar nenhum efeito adverso em nenhum dos sabores Unix que eu conheço.

    
por 11.10.2012 / 20:50
13

Algumas teclas do teclado não correspondem a caracteres reais. Por exemplo, A corresponde ao caractere a , mas as teclas Acima e F1 não possuem seus próprios caracteres dedicados. Quando essas teclas especiais são pressionadas, em vez de obter um único caractere correspondente à tecla, o terminal converte a tecla em uma seqüência especial de vários caracteres que geralmente começam com o caractere de escape (geralmente exibido como ^[ ). Por exemplo, Acima geralmente gera a seqüência ^[[A (são 3 caracteres de uma chave: escape, [ e A ).

O motivo pelo qual você normalmente não vê ^[[A é porque a maioria dos aplicativos de console é inteligente o suficiente para converter as seqüências especiais em comandos úteis, em vez de simplesmente fazer o eco para o console. Para fazer isso, eles desativam o eco integrado do terminal e fazem seu próprio processamento de nível inferior. Por exemplo, quando bash^[[A , realiz percebe que significa que você pressionou Acima e em vez de fazer eco de ^[[A de volta, ele faz um monte de coisas para excluir o que você digitou até agora, busque o comando anterior salvo no histórico e imprima isso.

Se você vir ^[[A quando pressionar Acima , isso normalmente significa que o eco do terminal está ativado e o processo em primeiro plano (aquele no controle do terminal) não está fazendo nenhum processamento mencionado acima. Isso pode ser porque o aplicativo simplesmente ignora o terminal (como a maioria dos comandos não interativos). Observe que, normalmente, o shell coloca o terminal no modo canônico e ativa o eco antes de executar um processo de primeiro plano e restaura suas próprias configurações depois que recupera o controle do terminal após o comando sair.

O eco parece bastante inofensivo. Lembre-se de que, se o comando em execução não ler o terminal, os caracteres gerados pelo teclado provavelmente ficarão na fila de entrada de bash , portanto, tenha cuidado com o que você digita, pois provavelmente eles serão interpretados como comandos normais. uma vez bash retoma a leitura do terminal.

¹ Esta é realmente uma simplificação excessiva. Como a sequência específica pode variar de acordo com o tipo de terminal, normalmente há várias camadas de bibliotecas de abstração entre um aplicativo de console e o próprio terminal. Por exemplo, bash usa a biblioteca readline para fazer a maior parte de sua entrada.

    
por 11.10.2012 / 21:04