Моя проблема состоит в том, что оболочка Bash прекращает показывать символы, которые я ввожу в нее. Это действительно читает команды все же.
Я столкнулся с этой проблемой довольно много раз, и я не понимаю то, что вызывает ее. Я знаю, как решить его, но мне действительно не нравится он, когда я - "voodooing" мой способ из проблем.
Я опишу эти два способа, которыми я столкнулся с этой проблемой:
Я выполняю определенный процесс, http://pythonpaste.org/script/ и иногда когда я останавливаю это, или он освобождается от контроля, отдан к оболочке. Когда я затем иду и ввожу команды в оболочку, символы, которые я ввожу, не обнаруживаются. Когда я нажимаю 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
Я бы запустил нового пользователя в системе (я имею в виду создать нового чистого пользователя и залогинился бы там) и посмотрел, есть ли проблема. Если нет - то это либо настройки терминала, либо настройки вашего X11.
При запуске оболочки или большинства программ в оболочке все, что вы вводите, возвращается в терминал пользователя подсистемой 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 .
TLDR; запустите это в терминале, который больше не будет отображать введенные вами команды:
reset
Ваш терминал будет очищен и сброшен, и вы снова сможете видеть введенные команды. Обратите внимание, что при вводе reset
выше вы ничего не увидите, поэтому может быть полезно нажать Ctrl + C перед вводом reset
, чтобы очистить все существующие команды или случайные символы перед выполнением команды сброса.
Длинный ответ от кого-то: Шелл не показывает введенные команды, "сброс" работает, но что случилось?
stty sane
, чтобы снова сделать ваш терминал «нормальным»
чтобы снова включить отображение вводимых символов, включая специальные символы, такие как backspace
по сравнению с reset
, он сохраняет ваш терминал история/прокрутка