Як не допустити, щоб випадковий вихід консолі порушив термінал?


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ще раз, швидше за все, він розірве термінал, який, здається, підтверджує цю теорію). Якщо це правильно, що це за код втечі? Чи є стандартні способи її відключити?

Відповіді:


22

Ні:

  • не існує стандартного способу "відключити", і
  • деталі поломки насправді залежать від терміналу, але
  • є деякі загальноприйняті функції, за які можна отримати неправильну поведінку.

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

Деякі з інших послідовностей евакуації, наприклад, покладаються на відповіді хоста від терміналу на запит (послідовність виходу). Якщо хост цього не очікує, результат - сміття на екрані.

В інших випадках (наприклад, у мережевих пристроях із жорстко кодованими послідовностями для консолі Linux), інші термінали бачать, що це неправильно, і, здається, замерзають.

Отже ... ви можете зосередитись лише на одному терміналі, вирізати все, що виглядає як неприємність (як, наприклад, деякі пропонують видалити можливість використання миші для позиціонування в редакторах), і ви можете отримати щось, що не має видимих ​​дірок. Але це лише один термінал.


0

Якщо ваш керуючий і знаєте, що команда вас накрутить, я зазвичай переглядаю вихід у чомусь меншому.

head -n4 /dev/urandom | less

Здається, це звичайно захоплює сміття та друкує його з розумним уявленням, ніколи не виникало проблем, які я пам’ятаю після виходу з q , який я сміливо мав на увазі ваших незнайомих людей із тим, щоб менше вийти.


2
У запитанні конкретно сказано, що він не шукає рішень, які вимагають, щоб ви заздалегідь знали, що програма виробляє бінарний вихід.
Бармар

-1

Трубопровід виведення вашої команди тощо у tee -


2
Як це допоможе? Він все ще надрукує вихід, але також збереже його у файлі.
Бармар

Можливо, ви мали на увазі moreабо less?
Бармар

в рамках ОП з моїм наголосом: "... після видачі такої команди. Я не шукаю таких рішень, як передача порушень командам"
Jeff Schaller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.