Чому консоль іноді потребує скидання після CTRL + C


9

Деякі інструменти інтерфейсу командного рядка повертають зламану консоль при її скасуванні CTRL+C. Іноді текст невидимий, або виникають графічні проблеми, поки я не запускаю команду reset.

(Я використовую bash, але сподіваюся, що він не залежить від оболонки.)

Чи має цей ефект ім’я? Що це викликає, і як програмісти можуть запобігти цьому в інструментах? Чи існує стратегія, як вирішувати цю проблему основними мовами програмування?



stty saneдля сірих бороди
Thorbjørn Ravn Andersen

Відповіді:


14

Консолі іноді потрібна reset(1) (або якась stty(1)команда), оскільки стан псевдотерміналу не змінюється, коли якийсь процес (наприклад, програма, запущена вашою оболонкою), закінчується.

Прочитайте демістифікований tty .

(Я вважаю, що обробка псевдотерміналів і псевдоттис є найважчою частиною Linux)

Чи існує стратегія, як вирішувати цю проблему основними мовами програмування?

Добре поводилася програма, яка займається терміналом і змінює його режим або дисципліну лінії, повинна намагатися уникати збоїв і видавати відповідні дзвінки (див. Терміни (3) ), щоб перевести термінал у потрібний стан. До речі, корисні бібліотеки на зразок ncurses або readline (але вам потрібно зателефонувати за їх процедурами очищення).

Див. Сигнал (7) та безпека сигналу (7) . Уникнути збоїв у коді складно. Прочитайте про невизначену поведінку .

Недосконалим рішенням може бути визначення функції оболонки, яка запускає вашу програму, а потім робить reset(що іноді може бути невідповідним).


Таке рішення не є великим; Іноді це resetможе призвести до різних sttyналаштувань від початкових.
Боб

Так, дякую, що вказали на це. Я додав "недосконалий".
Базиль Старинкевич

Я прочитав ваші посилання, вони були цікаві, але було б корисно, якби ви могли додати вказівник на розділ для цього Q / A кожного. Прочитавши демістифікований tty, я запустив stty -a > /tmp/test1у bash тоді команду, яку я скасував. Колір терміналу тепер став червоним. stty -a > /tmp/test2але test1і test2були абсолютно однакові.
Йонас Штейн

1

Відповідь на цю проблему не є повністю незалежною від оболонок. У zsh є ttyctlвбудований, який може "заморозити" або "розморозити" режим tty. Я не думаю, що є еквівалент у баші. settyКоманда в Tcsh робить те ж саме, але більш дрібнозернистий: ви можете заморозити окремі настройки.

Замороження режиму tty просто означає, що zsh запам’ятає поточний режим, і якщо деяка майбутня дитина змінить його, режим буде відновлений, коли дитина призупинить або припинить.

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

resetробить більше, ніж відновлює sttyрежими, тому вам все одно може знадобитися іноді, але не часто.


Дійсно: я запустив stty -a> / tmp / test1 в bash, а потім команду, яку я скасував. Колір терміналу тепер став червоним. stty -a> / tmp / test2, але test1 та test2 були абсолютно однакові. Я спробував те ж саме з tcsh, але не зміг зірвати свою команду CTRL + C. Кольори залишилися прекрасними.
Йонас Штейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.