Shell не показывает введенный в командах, “сбрасывает” работы, но что произошло?

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

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

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

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

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

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

$ grep foo * -l | xargs vim

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

Мое предположение - то, что обе проблемы имеют базовую причину, но я отчасти озадачен о том, как или какова та причина.

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

Править

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

stty --all

команда согласно запросу John S. Gruber дала следующий вывод (пробел, отредактированный для удобочитаемости)

speed 0 baud;
rows 53;
columns 186;
line = 0;
intr = <undef>;
quit = <undef>;
erase = <undef>;
kill = <undef>; 
eof = <undef>;
eol = <undef>; 
eol2 = <undef>; 
swtch = <undef>; 
start = <undef>; 
stop = <undef>; 
susp = <undef>;
rprnt = <undef>; 
werase = <undef>; 
lnext = <undef>; 
flush = <undef>; 
min = 0; 
time = 0;
-parenb 
-parodd cs8 
-hupcl 
-cstopb cread 
-clocal 
-crtscts
-ignbrk 
-brkint 
-ignpar 
-parmrk 
-inpck 
-istrip 
-inlcr 
-igncr 
-icrnl 
-ixon 
-ixoff 
-iuclc 
-ixany 
-imaxbel 
-iutf8
-opost 
-olcuc 
-ocrnl 
-onlcr 
-onocr 
-onlret 
-ofill 
-ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig 
-icanon 
-iexten 
-echo 
-echoe 
-echok 
-echonl 
-noflsh 
-xcase 
-tostop 
-echoprt 
-echoctl 
-echoke
57
задан 5 April 2014 в 18:04

4 ответа

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

0
ответ дан 5 April 2014 в 18:04

При запуске оболочки или большинства программ в оболочке все, что вы вводите, возвращается в терминал пользователя подсистемой 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 .

0
ответ дан 5 April 2014 в 18:04

TLDR; запустите это в терминале, который больше не будет отображать введенные вами команды:

reset

Ваш терминал будет очищен и сброшен, и вы снова сможете видеть введенные команды. Обратите внимание, что при вводе reset выше вы ничего не увидите, поэтому может быть полезно нажать Ctrl + C перед вводом reset, чтобы очистить все существующие команды или случайные символы перед выполнением команды сброса.

Длинный ответ от кого-то: Шелл не показывает введенные команды, "сброс" работает, но что случилось?

12
ответ дан 11 May 2020 в 19:30

stty sane, чтобы снова сделать ваш терминал «нормальным»

чтобы снова включить отображение вводимых символов, включая специальные символы, такие как backspace

по сравнению с reset, он сохраняет ваш терминал история/прокрутка

11
ответ дан 28 July 2020 в 10:00

Другие вопросы по тегам:

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