Como impedir que a saída aleatória do console quebre o terminal?

23

Existem muitas questões sobre o SE que mostram como se recuperar do terminal quebrado por cat /dev/urandom . Para aqueles que não estão familiarizados com este problema - aqui do que se trata:

  1. Você executa cat /dev/urandom ou equivalente (por exemplo, cat binary_file.dat ).
  2. O lixo é impresso.
  3. Isso ficaria bem ... exceto que o seu terminal continua a imprimir lixo mesmo após o comando terminar! Aqui está uma captura de tela de um texto incorreto que, na verdade, é uma saída g ++:

    Eu acho que as pessoas estavam certas sobre erros de C ++ às vezes sendo muito enigmáticas!

A solução usual é executar stty sane && reset , embora seja um pouco chato executá-lo toda vez que isso acontece.

Por causa disso, o que eu quero focar nessa questão é a razão original porque isso acontece, e como evitar que o terminal quebre após tal comando ser emitido. Eu não estou procurando soluções como piping the ofending comandos para tr ou xxd , porque isso requer que você saiba que o programa / arquivo saídas binário antes de você realmente executar / imprimi-lo e precisa ser lembrado cada vez você produz esses dados.

Eu notei o mesmo comportamento no URxvt, no PuTTY e no buffer de quadro do Linux, portanto, não acho que isso seja um problema específico do terminal. Meu principal suspeito é que a saída aleatória contém algum código de escape ANSI que vira a codificação de caracteres (na verdade, se você executar cat /dev/urandom novamente, as chances são de que interromperá o terminal, o que parece confirmar isso teoria). Se isso está certo, o que é esse código de escape? Existe alguma maneira padrão de desativá-lo?

    
por rr- 07.12.2015 / 22:35

3 respostas

22

Não:

  • não há uma maneira padrão de "desativá-lo" e
  • os detalhes da quebra são realmente específicos do terminal, mas
  • existem alguns recursos comumente implementados para os quais você pode ter um mau comportamento.

Para recursos comumente implementados, observe o conjunto de caracteres alternativos no estilo VT100, que é ativado por ^N e ^O (ativar / desativar). Isso pode ser suprimido em alguns terminais ao usar o modo UTF-8, mas os mesmos terminais têm ampla oportunidade de destruir sua tela (falando sobre tela GNU, console Linux, PuTTY aqui) com as seqüências de escape que eles fazem reconhecer.

Algumas das outras sequências de escape, por exemplo, dependem de respostas do terminal para uma consulta (sequência de escape) pelo hospedeiro. Se o host não espera, o resultado é lixo na tela.

Em outros casos (vistos, por exemplo, em dispositivos de rede com sequências de escape codificadas permanentemente para o console Linux), outros terminais verão isso como codificado incorretamente e parecerão congelar.

Então ... você poderia se concentrar em apenas um terminal, remover qualquer coisa que parecesse um incômodo (como, por exemplo, sugerir a remoção da capacidade de usar o mouse para posicionar os editores), e você pode obter algo que não tem furos aparentes. Mas isso é apenas um terminal.

    
por 07.12.2015 / 22:50
0

Se você estiver no controle e souber que um comando vai estragar você, normalmente visualizarei a saída em algo como menos.

head -n4 /dev/urandom | less

Este costume parece capturar lixo e imprimi-lo com uma representação sã, nunca tive nenhum problema que eu me lembre depois de sair com q , que eu nego caso você não está familiarizado com a saída menos.

    
por 09.12.2015 / 01:53
-1

Canalize a saída do seu comando, etc. em tee -

    
por 09.12.2015 / 20:35