Оболочка не показывает набранные в командах & ldquo; reset & rdquo; работает, но что случилось?

Моя проблема в том, что оболочка Bash перестает показывать набираемые в ней символы. Тем не менее, он читает команды.

Я сталкивался с этой проблемой довольно много раз, и я не понимаю, чем она вызвана. Я знаю, как решить эту проблему, но мне действительно не нравится, когда я «стараюсь» избавиться от проблем.

Я опишу два способа решения этой проблемы:

Я запускаю определенный процесс, http://pythonpaste.org/script/ и иногда когда я останавливаю это или оно ломается, управление возвращается обратно в оболочку. Когда я иду и набираю команды в оболочке, символы, которые я печатаю, не отображаются. Когда я нажимаю ввод, команды отправляются . Так, например:

  • Я набираю «ls»
  • Я вижу только пустое приглашение и ничего более
  • Я нажимаю клавишу ввода, и мне дают список файлы, другими словами: команда выполняется , выполняется
  • , когда я даю команду «сброс», оболочка снова начинает нормально работать

Второй способ это Это происходит, когда я даю команду, подобную этой:

$ grep foo * -l | xargs vim

Я использую grep для поиска файлов с определенным шаблоном, а затем я хочу открыть все файлы, полученные из grep. Это работает как шарм (хотя и не так быстро, как я надеялся). Но когда я выхожу из Vim, моя оболочка перестает показывать вводимые в нее символы. Команда сброса решает проблему.

Я предполагаю, что обе проблемы имеют основную причину, но я как бы озадачен тем, как или какова эта причина.

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

Редактировать

Предоставление команды

stty --all

в соответствии с запросом Джона С. Грубера дало следующий вывод (пробел, отредактированный для удобства чтения)

[112 ]

57
задан 19.05.2020, 02:06

2 ответа

При запуске оболочки или большинства программ в оболочке все, что вы вводите, возвращается в терминал пользователя подсистемой tty ядра. Есть и другая специальная обработка для стирания символов, Ctrl + R, Ctrl + Z и т. Д.

Определенные программы (в частности, редактор), которые запускаются из командной строки, не нуждаются или не хотят этого. По этой причине они сигнализируют ядру с вызовом IOCTL против tty (терминального) устройства, что они не хотят этого поведения. Они также не хотят, чтобы специальные персонажи делали особые вещи. Вместо этого они просят ядро ​​для «сырого» режима. В частности, редактор вроде vim отключает различные «настройки эха». Все это относится к реальным терминалам tty на последовательных линиях компьютера, или к виртуальным терминалам на Alt + Ctrl + F1, или к действительно виртуальным терминалам, которые вы получаете, когда запускаете что-то вроде gnome-терминала под GUI.

Предполагается, что такие программы сбрасывают любые режимы, которые они изменяют в виртуальном tty, который они используют перед выходом, либо путем ввода команды редактора выхода, либо, например, путем приема сигнала (из Control + C).

Если они не могут сделать это правильно, tty остается в забавном состоянии, которое вы обнаружили. Так как программы могут не выполнить сброс терминала, была написана команда reset, чтобы позволить пользователю выполнить восстановление.

Я предполагаю, что прерывание мешает программному обеспечению Python, которое вы используете. Я предполагаю, что у этой программы нет возможности перезагрузить терминал или она просто не может это сделать.

В случае vim, когда я запускаю ваш пример, я получаю то же поведение, которое вы описали. Я также вижу сообщение "Vim: Предупреждение: вход не от терминала" (он сбрасывается при сбросе). Это потому, что vim обычно не запускается из оболочки. Вместо этого команды 'grep' и 'xargs' использовали стандартный ввод, обычно занятый tty, для передачи имен файлов из grep в xargs.

В вашем опубликованном выводе из stty -a мы видим «-echo», также подтверждающее, что это проблема. Если вы убьете vim таким образом, что он не сможет корректно обработать сигнал, вы, вероятно, увидите ту же проблему.

Эта проблема описана в на https://stackoverflow.com/questions/3852616/xargs-with-command-that-open-editor-leaves-shell-in-weird-state . 1116]

Решение для случая vim - избегать xargs и использовать вместо него:

 vim $(grep foo * -l)

Здесь список файлов создается оболочкой, как это было с xargs, но оболочка вызывает vim, который напрямую связан с телетайпом. Предупреждающее сообщение отправляется в файл вывода ошибок, и vim правильно устанавливает и сбрасывает настройки tty.

Больше ссылок здесь и еще один интересный здесь . Другое интересное решение дано в ответе на https://stackoverflow.com/questions/8228831/why-does-locate-filename-xargs-vim-cause-strange-terminal-behaviour .

67
ответ дан 19.05.2020, 02:08

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

0
ответ дан 19.05.2020, 02:07

Теги

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