Hay muchas preguntas sobre SE que muestran cómo recuperarse de un terminal roto cat /dev/urandom
. Para aquellos que no están familiarizados con este problema, de esto se trata:
- Ejecutas
cat /dev/urandom
o equivalente (por ejemplo,cat binary_file.dat
). - La basura está impresa.
Eso estaría bien ... ¡excepto que su terminal continúa imprimiendo basura incluso después de que el comando haya terminado! Aquí hay una captura de pantalla de un texto mal enviado que, de hecho, es una salida de g ++:
¡Supongo que la gente tenía razón acerca de que los errores de C ++ a veces son demasiado crípticos!
La solución habitual es ejecutar stty sane && reset
, aunque es un poco molesto ejecutarlo cada vez que esto sucede.
Por eso, en lo que quiero centrarme en esta pregunta es en la razón original por la que esto sucede y cómo evitar que el terminal se rompa después de que se emita dicho comando. No estoy en busca de soluciones, tales como tuberías de los comandos de ofender a tr
o xxd
, porque esto requiere que saber que el programa binario / archivo salidas antes de que realmente ejecuta / imprimirlo, y hay que recordar cada vez que le sucede a los datos de salida de dichos .
Noté el mismo comportamiento en URxvt, PuTTY y el buffer de trama de Linux, así que no creo que este sea un problema específico del terminal. Mi principal sospechoso es que la salida aleatoria contiene algún código de escape ANSI que invierte la codificación de caracteres (de hecho, si ejecuta de cat /dev/urandom
nuevo, es probable que rompa el terminal, lo que parece confirmar esta teoría). Si esto es correcto, ¿cuál es este código de escape? ¿Hay alguna forma estándar de desactivarlo?