В каком управляющем коде я нуждаюсь в PS*, чтобы удостовериться, что терминал вернулся в нормальных настройках на приглашении оболочки?

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

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

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

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

2
задан 06.10.2010, 07:35

3 ответа

Поместить

echo -n "$(tput rmacs)"

в $PROMPT_COMMAND.

1
ответ дан 08.12.2019, 05:53

Проблемы, которые Вы упоминаете, возникают в различных слоях, и только некоторые из них могут быть решены с “управляющими кодами”.

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

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

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

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

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

PS1="\[\017\]… "

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


Как Ignacio Vazquez-Abrams указывает в своем ответе, другой способ получить желаемую управляющую последовательность через команду tput:

tput rmacs

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

PROMPT_COMMAND='tput rmacs'

TTY (termios) опции

“Никакое эхо” проблема *** не прибывает из неожиданных настроек опций для основанного на ОС tty устройства, которое подключает Ваш эмулятор терминала ко всем программам, которые выполняют внутреннее окно терминала. Это часто - причина интерактивным текстом программы UI, которые имеют ошибки, катастрофический отказ, или уничтожаются так, чтобы они не могли восстановить tty к его исходному состоянию.

Можно управлять этими настройками с командой stty. Этот тип проблемы не может быть решен с “управляющими кодами”, так как tty опции настроены с помощью программного обеспечения API (см. tcsetattr (3) и termios (4)). Обычно stty sane хороший механизм сброса.
*** Также “никакой ^C/^Z/^ /”, “ступенька ступила вывод” (никакой автоматический CR, когда LF получен), и несколько других проблем.

сброс

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

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

^O и stty sane

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

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

Снова, Вы могли постараться не изменять PS1 (и обработать non-VT-100-style терминалы) при помощи tput (как предложил Ignacio Vazquez-Abrams):

PROMPT_COMMAND='stty sane; tput rmacs'
4
ответ дан 08.12.2019, 05:53

Таким образом, я буду меньшей командной строкой, Вы всегда имеете в xterm или в любом терминале сброс "кнопки" или жесткая перезагрузка, для terminal.app это находится под меню Shell. Отправьте alt-command-r Жесткой перезагрузки.

0
ответ дан 08.12.2019, 05:53

Теги

Похожие вопросы