Некоторые инструменты интерфейса командной строки возвращают сломанную консоль при отмене с помощью CTRL+C
. Иногда текст невидим, или возникают графические проблемы, пока я не выполню команду reset
.
(Я использую bash, но ожидаю, что он не зависит от оболочки.)
У этого эффекта есть имя? Что вызывает это, и как программисты могут предотвратить это в инструментах? Есть ли стратегия, как эта проблема решается на основных языках программирования?
command-line
console
kill
crash
Джонас Стейн
источник
источник
stty sane
для седых бородОтветы:
Консоли иногда требуется
reset(1)
(или какая-тоstty(1)
команда), потому что состояние псевдотерминала не изменяется, когда завершается какой-то процесс (например, программа, запущенная вашей оболочкой).Читайте tty демистифицирован .
(Я считаю обработку псевдо-терминалов и псевдотоней самой сложной частью Linux)
Хорошо работающая программа, работающая с терминалом и изменяющая его режим или линейную дисциплину, должна стараться избегать сбоев и выполнять соответствующие вызовы (см. Termios (3) ), чтобы перевести терминал в правильное состояние. Кстати, библиотеки, такие как ncurses или readline , полезны (но вам нужно правильно вызывать их процедуры очистки).
См. Сигнал (7) и безопасность сигнала (7) . Избегать сбоев в вашем коде сложно. Читайте о неопределенном поведении .
Несовершенный обходной путь может заключаться в определении функции оболочки, которая выполняет вашу программу, а затем выполняет
reset
(что иногда может быть неуместным).источник
reset
может привести к отличнымstty
настройкам от оригинальных.stty -a > /tmp/test1
в bash, а затем команду, которую я отменил. Цвет терминала теперь красный.stty -a > /tmp/test2
ноtest1
иtest2
были точно такими же.Реакция на эту проблему не является полностью независимой от оболочки. В zsh есть
ttyctl
встроенная функция, которая может «заморозить» или «разморозить» режим tty. Я не думаю, что есть эквивалент в Bash. Командаsetty
в tcsh делает то же самое, но более детально: вы можете заморозить отдельные настройки.Замораживание режима tty просто означает, что zsh запомнит текущий режим, и если какой-то будущий потомок изменит его, режим будет восстановлен, когда потомок приостановит или завершит работу.
Это защитит вас от некоторых негативных последствий программ, которые аварийно завершают работу или не могут очистить терминал. Вы должны помнить, что нужно разморозить, если вы хотите внести изменения
stty
, иначе оболочка немедленно отменит то, что выstty
сделали.reset
делает больше, чемstty
режимы восстановления , так что иногда вам это может понадобиться, но не часто.источник