Entrada da 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 retorne imediatamente, insiro algumas letras (basicamente digitando o próximo comando antes de perceber que o anterior não terminou) e a entrada sempre se parece com isso (especialmente ao usar teclas de seta para cima e para baixo :)

]]A^ or ]]B^

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

U2ros
fonte
1
Isso não é específico do bash, eu removeria essa tag.
Didi Kohen

Respostas:

8

Essas strings são a representação bruta dos caracteres especiais que você digitou (como início, fim, setas, tabulação etc ...).
O efeito nocivo deles é controlado pelo comando que você está executando, se estiver recebendo informações do terminal, esses caracteres farão parte dela.
Se não receber a entrada do terminal, não deverá ter efeitos adversos em nenhum dos sabores do Unix que conheço.

Didi Kohen
fonte
13

Algumas teclas do teclado não correspondem a caracteres reais. Por exemplo, Acorresponde ao caractere, amas as teclas Upe F1não têm seus próprios caracteres dedicados. Quando essas teclas especiais são pressionadas, em vez de obter um único caractere correspondente à tecla, o terminal converte o pressionamento de tecla em uma sequência especial de vários caracteres que normalmente começam com o caractere de escape (geralmente exibido como ^[). Por exemplo, Upgeralmente gera a sequência ^[[A(são 3 caracteres de uma tecla: 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 apenas repeti-las no console. Para fazer isso, eles desligam o eco interno do terminal e fazem seu próprio processamento de nível inferior. Por exemplo, quando bash^[[A, real percebe que significa que você pressionou Upe, em vez de ^[[Avoltar, faz um monte de coisas para excluir o que você digitou até agora, buscar o comando anterior salvo no histórico e imprimi-lo.

Se você vir ^[[Apressionando Up, isso normalmente significa que o eco do terminal está ativado e o processo em primeiro plano (aquele que está no controle do terminal) não está executando nenhum dos processos especiais mencionados acima. Isso pode ocorrer 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 em primeiro plano, e restaura suas próprias configurações assim que recupera o controle do terminal após a saída do comando.

O eco parece bastante inofensivo. Lembre-se de que, se o comando em execução não for lido no terminal, os caracteres que você gerou através do teclado provavelmente terminarão na bashfila de entrada, portanto, tenha cuidado com o que você digita, pois provavelmente serão interpretados como comandos normais, uma vez que bashretomam a leitura do terminal.

Actually Na verdade, isso é uma simplificação excessiva. Como a sequência específica pode variar de acordo com o tipo de terminal, normalmente existem várias camadas de bibliotecas de abstração entre um aplicativo de console e o próprio terminal. Por exemplo, bashusa a readlinebiblioteca para fazer a maior parte de sua entrada.

jw013
fonte
1
Pelo que entendi da pergunta, o caso aqui foi durante a execução de outro comando e não no período de prata entre a saída do processo e antes do bash restaurando as configurações do terminal. Eu votei na sua resposta, porém, já que ela está explicando o caso em detalhes, ao contrário da minha resposta, que é o mínimo absoluto necessário para responder.
Didi Kohen
@ David David Acho que você está certo sobre a pergunta original. Ajustei um pouco minha resposta para explicar quando o comando ainda está em execução.
Jw013