Как предотвратить случайный выход консоли из строя терминала?


23

Есть много вопросов о SE, которые показывают, как восстановиться после поломки терминала cat /dev/urandom. Для тех, кто не знаком с этой проблемой - вот что это такое:

  1. Вы выполняете cat /dev/urandomили эквивалент (например, cat binary_file.dat).
  2. Мусор распечатан.
  3. Это было бы хорошо ... за исключением того, что ваш терминал продолжает печатать мусор даже после завершения команды! Вот скриншот ошибочного текста, который на самом деле выводится на g ++:

    Пример скриншота

    Я думаю, что люди были правы в том, что ошибки C ++ иногда слишком загадочны!

Обычное решение - запустить stty sane && reset, хотя запускать его каждый раз, когда это происходит, немного раздражает.

Поэтому в этом вопросе я хочу остановиться на первоначальной причине, по которой это происходит, и на том , как предотвратить поломку терминала после выполнения такой команды. Я не ищу решения, такие как передача ошибочных команд в trили xxd, потому что это требует, чтобы вы знали, что программа / файл выводит двоичный файл перед тем, как вы фактически запустите / распечатаете его, и должны запоминаться каждый раз, когда вам случается выводить такие данные ,

Я заметил то же самое поведение в буфере кадров URxvt, PuTTY и Linux, поэтому я не думаю, что это специфическая для терминала проблема. Я подозреваю, что случайный вывод содержит некоторый управляющий код ANSI, который переворачивает кодировку символов (фактически, если вы запустите cat /dev/urandomснова, скорее всего, он сломает терминал, что, кажется, подтверждает эту теорию). Если это правильно, что это за escape-код? Есть ли стандартные способы его отключить?

Ответы:


22

Нет:

  • не существует стандартного способа «отключить его», и
  • детали поломки на самом деле специфичны для терминала, но
  • Есть некоторые общепринятые функции, за которые вы можете получить неправильное поведение.

Для часто реализуемых функций обращайтесь к альтернативному набору символов в стиле VT100, который активируется с помощью ^Nи ^O(включение / отключение). Это может быть подавлено в некоторых терминалах при использовании режима UTF-8, но те же терминалы имеют широкие возможности для очистки вашего экрана (говоря об экране GNU, консоли Linux, PuTTY здесь) с помощью escape-последовательностей, которые они действительно распознают.

Некоторые из других escape-последовательностей, например, полагаются на ответы терминала на запрос (escape-последовательность) хоста. Если хост не ожидает этого, результатом будет мусор на экране.

В других случаях (наблюдаемых, например, в сетевых устройствах с жестко запрограммированными escape-последовательностями для консоли Linux) другие терминалы увидят, что они неправильно закодированы, и, похоже, зависают.

Итак ... вы можете сосредоточиться только на одном терминале, обрезать все, что выглядит как неприятность (как, например, некоторые предлагают исключить возможность использовать мышь для позиционирования в редакторах), и вы можете получить что-то, что не имеет видимых дыр. Но это только один терминал.


0

Если вы контролируете и знаете, что команда вас облажает, я обычно просматриваю вывод примерно так же.

head -n4 /dev/urandom | less

Это обычно, кажется, собирает мусор и печатает его с нормальным представлением, никогда не было никаких проблем, которые я помню после выхода с q , который я выделил жирным шрифтом, если вы не знакомы с выходом меньше.


2
Вопрос, в частности, говорит о том, что он не ищет решений, которые требуют, чтобы вы знали заранее, что программа производит двоичный вывод.
Бармар

-1

Передайте вывод вашей команды и т. Д. В тройник -


2
Как это поможет? Он по-прежнему печатает вывод, но также сохраняет его в файле.
Бармар

Может ты имел ввиду moreили less?
Бармар

в соответствии с ОП с моим акцентом: «... после того, как такая команда выпущена. Я не ищу решений, таких как передача ошибочных команд»
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.