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

23

Há muitas perguntas no SE que mostram como recuperar do terminal quebrado por cat /dev/urandom. Para aqueles que não estão familiarizados com este problema - aqui está o que é:

  1. Você executa cat /dev/urandomou equivalente (por exemplo cat binary_file.dat).
  2. Lixo é impresso.
  3. Tudo bem ... exceto que o seu terminal continua imprimindo lixo mesmo depois que o comando é concluído! Aqui está uma captura de tela de um texto incorreto que, de fato, é uma saída do g ++:

    Captura de tela de exemplo

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

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

Por causa disso, o que eu quero focar nesta questão é a razão original pela qual isso acontece e como impedir que o terminal quebre após a emissão desse comando. Não estou procurando soluções como canalizar os comandos ofensivos para trou xxd, porque isso exige que você saiba que o programa / arquivo gera binário antes de realmente executá-lo / imprimi-lo e precisa ser lembrado toda vez que produzir esses dados .

Percebi o mesmo comportamento no buffer de quadros URxvt, PuTTY e Linux, então não acho que esse seja um problema específico do terminal. Meu principal suspeito é que a saída aleatória contenha algum código de escape ANSI que inverta a codificação de caracteres (de fato, se você executar cat /dev/urandomnovamente, as chances são de que isso desintegrará o terminal, o que parece confirmar essa teoria). Se isso estiver correto, qual é esse código de escape? Existem maneiras padrão de desativá-lo?

rr-
fonte

Respostas:

22

Não:

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

Para recursos comumente implementados, consulte o conjunto de caracteres alternativos no estilo VT100, que é ativado por ^Ne ^O(ativar / desativar). Isso pode ser suprimida em alguns terminais quando utilizar o modo UTF-8, mas os mesmos terminais têm ampla oportunidade para destruindo sua tela (falando sobre tela GNU, console Linux, PuTTY aqui) com as sequências de escape que eles não reconhecem.

Algumas das outras seqüências de escape, por exemplo, contam com respostas do terminal a uma consulta (sequência de escape) do host. Se o host não espera, o resultado é lixo na tela.

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

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

Thomas Dickey
fonte
0

Se você está no controle e sabe que um comando vai te ferrar, geralmente visualizarei a saída em algo como menos.

head -n4 /dev/urandom | less

Isso de sempre parece capturar lixo e imprimi-lo com uma representação sã, nunca tive nenhum problema que lembro depois de sair com q , que, em negrito, você não está familiarizado em sair menos.

ThorSummoner
fonte
2
A pergunta diz especificamente que ele não está procurando soluções que exijam que você saiba com antecedência que o programa produz saída binária.
Barmar
-1

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

brandon
fonte
2
Como isso vai ajudar? Ele ainda imprimirá a saída, mas também a salvará em um arquivo.
Barmar
Talvez você quis dizer moreou less?
Barmar
de acordo com o OP com ênfase: "... depois que esse comando é emitido. Não estou procurando soluções como canalizar os comandos incorretos"
Jeff Schaller