Некоторые клавиши на вашей клавиатуре не соответствуют реальным символам. Например, Aсоответствует характеру , a
но Upи F1ключи не имеют свои собственные специальные символы. Когда эти специальные клавиши нажимаются, вместо получения одного символа, соответствующего клавише, терминал преобразует нажатие клавиши в специальную последовательность из нескольких символов, которая обычно начинается с escape-символа (обычно отображается как ^[
). Например, Upобычно генерирует последовательность ^[[A
(это 3 символа от одного ключа: escape [
и A
).
Причина, по которой вы обычно не видите, ^[[A
состоит в том, что большинство консольных приложений достаточно умны, чтобы преобразовывать специальные последовательности в полезные команды, а не просто выводить их на консоль. Для этого они отключают встроенный эхо-сигнал терминала и выполняют собственную низкоуровневую обработку. Например, когда bash
видит ^[[A
, ¹ он понимает, что означает, что вы нажали, Upи вместо того, чтобы ^[[A
возвращать его назад, он делает целую кучу вещей, чтобы удалить все, что вы уже набрали, извлечь предыдущую команду, сохраненную в истории, и напечатать ее вместо этого.
Если вы видите, ^[[A
когда нажимаете Up, это обычно означает, что эхо-сигнал терминала включен, и процесс переднего плана (тот, который управляет терминалом) не выполняет какой-либо специальной обработки, упомянутой выше. Это может быть потому, что приложение просто игнорирует терминал (как большинство неинтерактивных команд). Обратите внимание, что обычно оболочка переводит терминал в канонический режим и включает эхо-сигнал перед запуском процесса переднего плана, а также восстанавливает свои собственные настройки после восстановления контроля над терминалом после выхода из команды.
Эхо кажется довольно безобидным. Просто помните, что если запущенная команда не читает с терминала, символы, которые вы сгенерировали с помощью клавиатуры, вероятно, попадут в bash
очередь ввода, поэтому будьте осторожны при вводе, поскольку они, вероятно, будут интерпретированы как обычные команды после bash
возобновления чтения. из терминала.
Actually Это на самом деле упрощение. Поскольку конкретная последовательность может варьироваться в зависимости от типа терминала, обычно существует несколько уровней библиотек абстракции между консольным приложением и самим терминалом. Например, bash
использует readline
библиотеку, чтобы сделать большую часть своего ввода.