Есть ли причина, по которой я получаю ^ [[A, когда я нажимаю стрелку на экране входа в консоль?

Всякий раз, когда я нахожусь в консоли, я нажимаю стрелку up умышленно, чтобы видеть ранее введенные команды. Но я вижу этот ^[[A.

Но когда я нажимаю Ctrl Alt Экран печати Scroll Lock Пауза перерыва Клавиши Page Up Страницы вниз Win не повторяют никаких символов.

В чем может быть причина?

Имеет ли символ ^[[A что-нибудь?

введите описание изображения здесь>> </p></body></html>

28 голосов | спросил Ruban Savvy 4 WedEurope/Moscow2013-12-04T10:54:35+04:00Europe/Moscow12bEurope/MoscowWed, 04 Dec 2013 10:54:35 +0400 2013, 10:54:35

5 ответов


18

Таким образом, терминал представляет исходный код ключа Up, отправленный ему клавиатурой. В основном, ваша оболочка обычно перехватывает нажатие клавиши, но в приглашении на вход нет ничего такого. Таким образом, персонаж, который вы набрали, печатается на консоль точно так же, как любая другая буква (или номер или что-то еще).

ответил strugee 4 WedEurope/Moscow2013-12-04T11:01:30+04:00Europe/Moscow12bEurope/MoscowWed, 04 Dec 2013 11:01:30 +0400 2013, 11:01:30
16

Клавиатуры отправляют события на компьютер. Событие говорит «код сканирования nnn down» или «код сканирования nnn up». На другом конце цепи приложения, работающие на терминале, ожидают ввода в виде последовательности символов. (Если они не запросили необработанный доступ, как это делает сервер X.) Когда вы нажимаете A , клавиатура отправляет информацию «код сканирования 38 вниз». Драйвер консоли просматривает раскладку клавиатуры и преобразует его в символ a "(если не нажата клавиша-модификатор).

Когда вы нажимаете клавишу или комбинацию клавиш, которая не приводит к символу, информация должна быть закодирована в терминах символов. Несколько клавиш и комбинаций клавиш имеют соответствующие управляющие символы, например. Ctrl + A отправляет символ (значение байта 1), Return отправляет символ (Ctrl + M, значение байта 13) и т. Д. Большинство функциональных клавиш не имеют соответствующий символ и вместо этого отправляет последовательность символов, которая начинается с символа (escape, byte value 27). Например, ключ Up преобразуется в escape-последовательность ␛[A (три символа: escape, open bracket, капитал A).

Запрос имени пользователя на консоли немой и не понимает большинство управляющих последовательностей. У него нет функций линии и истории, к которым вы привыкли: они предоставлены оболочкой, и пока вы не войдете в систему, у вас нет оболочки. Таким образом, он просто отображает escape-последовательность. Для символа нет символа, поэтому он отображается как ^[. Значок ^ традиционно используется в качестве префикса для управляющих символов, а escape - ^[ из-за его байтового значения: это значение байта [, минус 64.

Если вы нажмете Вверх в командной строке, это отправит ту же последовательность из 3 символов в вашу оболочку. Оболочка интерпретирует это как последовательность команд (обычно для вызова предыдущего элемента истории). Если вы нажмете Ctrl + V , затем Вверх в командной строке, это вставляет escape-последовательность в приглашении: Ctrl + V - это команда для вставки следующего символа буквально вместо интерпретации его как команды, поэтому не интерпретируется как начало escape-последовательности.

Некоторые клавиши являются только модификаторами и не передаются в приложения терминала. Например, когда вы нажимаете Shift , эта информация остается в драйвере терминала и учитывается, если вы затем нажимаете A , поэтому драйвер отправляет A, а не a.

Кроме того, некоторые функциональные клавиши могут не отображаться на консоли.

Для аналогичного вида в графическом интерфейсе см. Что такое метаинформация bash ключ?

ответил Gilles 5 ThuEurope/Moscow2013-12-05T04:24:03+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 04:24:03 +0400 2013, 04:24:03
4

Речь идет не о том, как клавиши представлены терминалом (т. е. приложение эмулятора терминала). Что вы видите, это код ANSI ( escape-последовательность ANSI ) для перемещения вверх одна строка, но переведена в печатную форму.

  1. Аппаратное обеспечение клавиатуры отправляет «коды сканирования», но они транслируются и представлены приложениям уровня командной строки в качестве символов. Ключ A становится одиночным байтом: A, если клавиша Shift недоступна (или Shift Lock), ---- +: = 1 =: + ---- в противном случае.

  2. В терминале, совместимом с ANSI, клавиши со стрелками не отправляют один символ (в наборе символов ASCII нет кодов для стрелок), но 3-символьная «escape-последовательность»: a. Остальные три клавиши со стрелками: escape-[-A.

  3. Одна и та же последовательность символов перемещает курсор вверх на одну строку, если отправляется (эхо) на старый физический терминал ANSI. Многие программы, в том числе эмуляторы терминалов, распознают эти последовательности символов и делают что-то подходящее: эмуляторы терминалов будут перемещать курсор вверх (это как escape-[-B, C, D библиотека перемещает курсор), но curses перехватит его и прокрутит историю.

  4. Чтобы избежать перемещения курсора по всему месту в программах, которые не нужны для перемещения курсора по экрану, вы часто увидите ESC на клавиатурном вводе, отображаемом как последовательность для печати bash (потому что escape соответствует ^[). Это фактически обрабатывается интерфейсом терминального устройства; см. control-[ . В результате стрелка вверх будет отображаться как stty(1). Вы увидите это из командной строки, если введите ^[[A, нажмите return и нажмите несколько клавиш со стрелками. Это также то, что вы видели на экране входа в консоль.

Наконец: Control , Alt , а другие упомянутые вами ключи не отображаются в последовательности символов. Они влияют на символ, отправленный другим нажатием клавиши (например, cat /a), или просто не имеют сопоставления с текстом. Такие нажатия клавиш могут быть обнаружены только программами, которые прослушивают события клавиатуры. Они не могут быть видны путем чтения со стандартного ввода (или должны быть записаны в файл).

ответил alexis 7 SatEurope/Moscow2013-12-07T04:57:44+04:00Europe/Moscow12bEurope/MoscowSat, 07 Dec 2013 04:57:44 +0400 2013, 04:57:44
3

Это поведение отличается от оболочки к оболочке. Большинство оболочек используют библиотеку под названием readline для редактирования строк в приглашении. Здесь - это полная ссылка для этой библиотеки, поэтому, когда приложение используя readline, вы можете редактировать и перемещаться по этим командам.

Вертикальные клавиши со стрелками настраиваются в readline для навигации по истории команд. И в прописке login нет истории команд. Вот почему символы ^[[A и ^[[B являются напечатан на экране. Итак, что означает ^[[A?

Страница руководства bash написана в PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

escape-последовательности для клавиш со стрелками в ANSI:

  • [ValueA Курсор вверх (где Value может быть emtpy)

  • [ValueB Курсор вниз (где Value может быть emtpy)

ответил chaos 4 WedEurope/Moscow2013-12-04T11:47:32+04:00Europe/Moscow12bEurope/MoscowWed, 04 Dec 2013 11:47:32 +0400 2013, 11:47:32
0

Это escape-коды ANSI . ^[ - это обозначение, которое ваша оболочка использует для отображения ESC byte (ASCII-байт 27). Таким образом, ваш пример представляет собой ESC-байт, за которым следует текст [A. Как вы можете видеть в статье в Википедии, ^[[ (ESC, а затем [) является Control Sequence Introductioncer или CSI. CSI A означает перемещение курсора на один столбец.

Если вы хотите увидеть escape-код в терминале, введите CTRL + V, а затем другую последовательность клавиш. Например, CTRL + V, за которым следует стрелка вверх, показывает ^[[A.

ответил yellowantphil 29 PMpWed, 29 Apr 2015 19:06:34 +030006Wednesday 2015, 19:06:34

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132