Клавиатуры отправляют события на компьютер. Событие говорит «сканировать код nnn вниз» или «сканировать код nnn вверх». На другом конце цепочки приложения, работающие в терминале, ожидают ввода в виде последовательности символов. (Если они не запросили необработанный доступ, как это делает X-сервер.) Когда вы нажимаете A, клавиатура отправляет информацию «отсканировать код 38 вниз». Драйвер консоли ищет свою раскладку клавиш и преобразует ее в «символ a
» (если не нажата клавиша-модификатор).
Когда вы нажимаете клавишу или комбинацию клавиш, которая не приводит к символу, информация должна быть закодирована в виде символов. Некоторые клавиши и комбинации клавиш имеют соответствующие управляющие символы, например, Ctrl+ Aотправляет символ ␁
(значение байта 1), Returnотправляет символ ␍
(Ctrl + M, значение байта 13) и т. Д. Большинство функциональных клавиш не имеют соответствующего символа и вместо этого отправляют последовательность символов, начинающаяся с символа ␛
(escape, значение байта 27). Например, ключ Upпереводится в escape-последовательность ␛[A
(три символа: escape, открывающая скобка, заглавная A).
Запрос имени пользователя на консоли тупой и не понимает большинство escape-последовательностей. Он не имеет функций линейного издания и истории, к которым вы привыкли: они предоставляются оболочкой, и до входа в систему у вас нет оболочки. Так что он просто отображает escape-последовательность. Для ␛
персонажа нет символа , поэтому он отображается как ^[
. ^
Знак традиционно используется в качестве префикса для управляющих символов, и побег ^[
из его байт значения: это значение байта [
, минус 64.
Если вы нажмете Upна приглашение оболочки, это отправит ту же 3-символьную последовательность в вашу оболочку. Оболочка интерпретирует это как последовательность команд (обычно для вызова предыдущего элемента истории). Если вы нажмете Ctrl+ Vзатем Upв приглашении оболочки, это вставит escape-последовательность в приглашении: Ctrl+ V- это команда, которая вставляет следующий символ буквально вместо того, чтобы интерпретировать его как команду, поэтому ␛
символ не интерпретируется как начало escape-последовательности ,
Некоторые ключи являются только модификаторами и не передаются в терминальные приложения. Например, когда вы нажимаете Shift, эта информация остается в драйвере терминала и учитывается, если вы затем нажимаете A, поэтому драйвер отправляет A
в приложение вместо a
.
Кроме того, некоторые функциональные клавиши могут не отображаться в вашей консоли.
Для аналогичного представления в графическом интерфейсе см. Что такое мета-ключ bash?
getty
илиlogin
, хотя я не знаю почему. Образованное гадание говорит, что экран печати интерпретируется специально ядром по историческим причинам. Я не уверен на 100% ни в одном, кроме модификаторов.