Какой код возврата мне нужен в PS *, чтобы убедиться, что терминал вернулся в обычные настройки в командной строке?

Иногда я случайно cat некоторыми двоичными данными; Иногда некоторые аварии программы ncurses – по множеству причин терминал может оказаться в плохом состоянии, требуя ручного reset . Это происходит слишком часто.

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

  • Как сбросить Bash на Mac OSX, .bash_profile поврежден и bash больше не работает
  • Где я могу найти темы bash_profile / bashrc?
  • Как сохранить историю bash во всех сессиях?
  • Как укоротить отображение символов для текущего каталога в приглашении
  • Пакетный эквивалент Windows «команда» в linux bash
  • Как найти и удалить несколько файлов в bash / linux
  • Есть ли простой способ убедиться, что настройки терминала (без жесткого сброса, очистки экрана и т. Д.) Восстанавливаются, когда оболочка восстанавливает управление?

    Это bash и Terminal.app но я предполагаю, что эта проблема довольно универсальна.

  • Cygwin фатальная ошибка неспособна переназначить .. Что это значит?
  • Что же такое Git Bash для Windows?
  • Команды npm не работают на WSL с zsh
  • Какие файлы запускаются при входе в систему или перезагрузке моей машины?
  • Терминал: префикс предыдущей команды?
  • Windows 10 bash и mintty
  • 3 Solutions collect form web for “Какой код возврата мне нужен в PS *, чтобы убедиться, что терминал вернулся в обычные настройки в командной строке?”

    Проблемы, которые вы упомянули, возникают в разных слоях, и только некоторые из них могут быть решены с помощью «escape-кодов».

    Альтернативные наборы символов в эмуляции терминала

    Существует общая проблема с терминалом, которая может быть описана как «(некоторые) строчные буквы отображаются как символы или символы рисования линии» (см. Этот другой вопрос SO ). Это может быть не связано с вашей проблемой «китайский мусор», но это самая близкая вещь, которую я видел. Вы также можете столкнуться с «китайским мусором» при интерпретации почти любого 8-битного потока данных в виде кодированного текста в формате UTF-16. Обычно это не «липкая» проблема, которую нужно сбросить, поэтому, вероятно, это не проблема, которую вы видите.

    Проблема «застряла с символами линии» обычно возникает от отправки эмулятору терминала непреднамеренной последовательности управления (или остановки программы до ее сброса терминала после переключения на альтернативный набор символов). Это может произойти, когда отображаются некоторые двоичные данные, а поток байтов содержит управляющую последовательность терминала, которая выбирает альтернативный набор символов.

    Это легко вызвать на большинстве терминалов типа VT-100, поскольку все, что требуется, это один байт (0x0e, см. Мой ответ на ранее связанный вопрос SO ). Управляющая последовательность для сброса этого условия также представляет собой один байт (0x0f, часто создаваемый через echo ^V^O (введенный как echo Control + V Control + O или непосредственно напечатанный как printf '\017' ).

    Вы можете устранить эту проблему ** , получив приглашение включить 0x0f байт.
    ** Если ваш «китайский мусор» вызван какой-то другой проблемой, тогда у него может быть другое решение.

     PS1="\[\017\]… " 

    \[ И \] должны сообщать bash, что ограниченный символ не печатается. Это позволяет bash сохранять точное представление о «физической» позиции курсора (это важно для правильного повторного отображения при использовании функций редактирования командной строки).


    Как указывает Игнасио Васкес-Абрамс в своем ответе , другой способ получить желаемую последовательность управления – через команду tput :

     tput rmacs 

    Используя этот метод, вы можете избежать изменения PS1 и просто поместить указанную выше команду в PROMPT_COMMAND:

     PROMPT_COMMAND='tput rmacs' 

    TTY (termios) Опции

    Проблема «no echo» *** исходит из неожиданных настроек опций для устройства tty на основе ОС, которое подключает эмулятор терминала ко всем программам, которые запускаются внутри окна терминала. Это часто вызывает интерактивные текстовые программы пользовательского интерфейса, которые имеют ошибки, аварийные ситуации или убиты, так что они не могут восстановить tty в исходное состояние.

    Вы можете управлять этими настройками с помощью команды stty . Эта проблема не может быть решена с помощью «escape-кодов», поскольку параметры tty настраиваются с помощью программных API (см. Tcsetattr (3) и termios (4) ). Как правило, stty sane режим является хорошим механизмом перезагрузки.
    *** Также «no ^ C / ^ Z / ^ /», «ступенчатый выход лестницы» (без автоматического CR при получении LF) и несколько других проблем.

    сброс

    Команда сброса обычно может помочь в обоих типах проблем. Он отправит последовательности управления инициализацией терминала, которые обычно исправляют проблему с альтернативным набором символов, и сбрасывает параметры tty на разумные значения.

    Проблема с сбросом заключается в том, что он также печатает дополнительные сообщения в некоторых системах (например, «Erase is …», «Interrupt is …»); Вы, вероятно, не хотите, чтобы они отображались перед каждым приглашением. Если ваша реализация сброса отправляет сообщения и управляющие последовательности в разные места (например, один идет на stdout, а другой переходит на stderr), тогда вы можете отфильтровать сообщения (например, PROMPT_COMMAND='reset 2>/dev/null' (См. Ниже) и пропустите ввод ^ O в подсказку).

    ^ O и stty sane

    В bash вы можете установить параметр PROMPT_COMMAND для команды, и bash будет запущен, если перед отображением первичного приглашения. Вы можете поместить все вызовы в stty sane и положить ^ O в свое приглашение:

     PROMPT_COMMAND='stty sane' PS1="\[\017\]… " 

    Опять же, вы можете избежать модификации PS1 (и обрабатывать терминалы с не-VT-100), используя tput (как было предложено Ignacio Vazquez-Abrams):

     PROMPT_COMMAND='stty sane; tput rmacs' 

    Положил

     echo -n "$(tput rmacs)" 

    В $PROMPT_COMMAND .

    Так что я буду меньше командной строки, у вас всегда есть xterm или на любом терминале сброс «кнопки» или жесткий сброс, для терминала .app он находится в меню «Шелл». Отправить Hard reset alt-command-r.

    Давайте будем гением компьютера.