Моя проблема в том, что оболочка Bash перестает показывать набираемые в ней символы. Тем не менее, он читает команды.
Я сталкивался с этой проблемой довольно много раз, и я не понимаю, чем она вызвана. Я знаю, как решить эту проблему, но мне действительно не нравится, когда я «стараюсь» избавиться от проблем.
Я опишу два способа решения этой проблемы:
Я запускаю определенный процесс, http://pythonpaste.org/script/ и иногда когда я останавливаю это или оно ломается, управление возвращается обратно в оболочку. Когда я иду и набираю команды в оболочке, символы, которые я печатаю, не отображаются. Когда я нажимаю ввод, команды отправляются . Так, например:
Второй способ это Это происходит, когда я даю команду, подобную этой:
$ grep foo * -l | xargs vim
Я использую grep для поиска файлов с определенным шаблоном, а затем я хочу открыть все файлы, полученные из grep. Это работает как шарм (хотя и не так быстро, как я надеялся). Но когда я выхожу из Vim, моя оболочка перестает показывать вводимые в нее символы. Команда сброса решает проблему.
Я предполагаю, что обе проблемы имеют основную причину, но я как бы озадачен тем, как или какова эта причина.
Поиск этой проблемы сам по себе проблематичен, потому что описание является довольно расплывчатым и не имеет для него жестких условий поиска.
Редактировать
Предоставление команды
stty --all
в соответствии с запросом Джона С. Грубера дало следующий вывод (пробел, отредактированный для удобства чтения)
[112 ]
При запуске оболочки или большинства программ в оболочке все, что вы вводите, возвращается в терминал пользователя подсистемой 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 .
Я бы запустил нового пользователя в системе (я имею в виду создать нового чистого пользователя и залогинился бы там) и посмотрел, есть ли проблема. Если нет - то это либо настройки терминала, либо настройки вашего X11.