Intereting Posts
Не удалось подключить debian к android через bluetooth Создать CentOS Live CD с предварительно загруженными файлами как анализировать файл, который постоянно изменяется с помощью awk? Нечувствительный к регистру поиск в man-страницах Как отправить stderr в stdout с помощью трубы в другую команду? Добавление новых устройств в mdadm raid10 – у нового устройства меньше секторов Как запустить приложение с определенными групповыми разрешениями? Сортировка и организация огромной кучи фотографий Файл сценария Bash ping для проверки доступности хоста Один лайнер для включения некоторых SCL и виртуальной среды python? Какой диспетчер дисплеев / оконный менеджер может поддерживать несколько мониторов с разным разрешением? Как я могу проверить разрешение на чтение файлов / proc / * / *? Как добавить произвольные файлы в мое установочное изображение Debian Как определить, использует ли текущий язык кодировку UTF-8? символьная ссылка perl в файле gz

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

Я недавно запустил tail -f в файле журнала сервера, который работал, пытаясь диагностировать ошибку, когда я случайно наткнулся на клавиатуру и набрал несколько символов. Они смешались с выходом журнала, и никак не могли сказать, что именно. У меня были так же неприятные вещи, которые случались со мной много раз, и я уверен, что это случилось со многими другими людьми здесь.

Поэтому мой вопрос заключается в следующем: почему оболочка (или терминал или что-то еще делает) неоднозначно смешивает ввод с командным выходом?

Я не прошу о практическом решении непосредственной проблемы. Я могу, возможно, выяснить, как заставить shell запускать stty -echo при запуске команды и stty echo когда он заканчивается. Но я хочу знать обоснование разработки терминала таким образом. Есть ли какая-то практическая цель? Или это что-то сделано только по соображениям совместимости или что-то, о чем совсем не думали?

Люди обычно хотят видеть, что они печатают (если это не пароль) 🙂

Терминал принимает вход в любое время и буферизует его, пока приложение не прочитает его. Более того, когда tty находится в готовом режиме, ядро ​​последовательно выполняет буферизацию целых строк и предоставляет некоторые элементарные функции редактирования строк, которые позволяют убить всю буферную строку (привязка по умолчанию Ctrl- u и backspace). В то время, когда строка вводится и редактируется, и пока вы не нажмете Enter , приложения, считывающие с терминала, ничего не читают.

Функциональность tty в ядре не знает и не может знать, когда и когда приложение, подобное tail , планирует выдавать выходные данные на терминале, поэтому он не сможет каким-либо образом … отменить (?) Редактирование строк в течение таких периодов времени и только в такие моменты.

В любом случае, имея возможность подготовить следующую строку для оболочки, в то время как что-то еще занято на терминале, а оболочка еще не готова прочитать эту команду, это не функция , а ошибка, поэтому я не буду защищать ее. Возможно, это не так полезно для tail (который никогда не будет завершаться сам по себе), но предварительно набирает следующую команду во время долгого выполнения cp или make (например) и даже редактирует эту команду с помощью Ctrl- h и Ctrl- u , все, прежде чем оболочка получит это, это обычная вещь. Тимоти Мартин написал в комментарии :

Стоит упомянуть, что less +F somefile предоставляет аналогичную функциональность для tail -f somefile за исключением того, что (случайно) набранные нажатия клавиш не будут отображаться на экране.

Да, но это не только предотвращает повторение эха этих символов, но и их ест , поэтому они не доступны для следующего приложения, которое хочет их прочитать!

Наконец, есть еще одна причина:

В исторические времена (до моего времени!) Терминалы с локальным эхом были обычными. То есть терминал (обычно на аппаратном уровне) будет эхом от символов, введенных вами локально, а также отправки их по последовательной линии. Это полезно для предоставления пользователю быстрой обратной связи, даже если в связи с подключением к системе UNIX было много латентности (подумайте, что 300 бод-модем набирает сервер терминалов с автоматическим telnet в медленную систему UNIX через сеть Token Ring – или что-то еще ).

Если у вас есть терминал с локальным эхом, вы хотите, чтобы stty -echo всегда на сервере UNIX, к которому вы подключены. Результат примерно такой же, как terminak без локального эха (общий вид сегодня) и stty echo enabled. Таким образом, с этой точки зрения, задача stty echo заключается в немедленном эхо-символе, как только они будут получены, независимо от того, какое программное обеспечение работает, в эмуляции того, что произойдет на терминале с локальным эхом.

(Кстати, если у вас есть терминал с локальным эхом, вы не можете скрыть свой пароль.)

С помощью zsh , если вы хотите отключить локальное echo устройство tty для конкретной команды, вы можете сделать следующее:

 STTY=-echo a-specific-command 

zsh будет применять конкретные настройки (путем вызова stty ) и восстанавливать их, когда команда завершается.

Конечно, вы, вероятно, захотите сделать это только для приложений, которые не читаются с устройства tty.