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

Одна возможная причина - то, что оболочка по умолчанию myusername не является ударом.

Можно проверить оболочку текущего пользователя с:

  • echo ${SHELL}
  • echo $0

Для изменения пользовательской оболочки, постоянно посмотрите man chsh , например:

chsh -s /bin/bash
33
05.12.2013, 02:24
7 ответов

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

20
27.01.2020, 19:37
  • 1
    @RubanSavvy Ctrl, Высокий звук и Win (часто называемый Супер в мире GNU/Linux) являются модификаторами. При нажатии их и ключа Вы будете видеть что-то другое распечатанное на экране. Блокировка прокрутки, которую я подозреваю, интерпретируется ядром или чем-то еще низкий уровень для управления tty, хотя я не уверен. Страницей вверх и вниз, вероятно, глотают getty или login, хотя я не уверен почему. Образованное предположение говорит, что экран печати интерпретируется особенно ядром по историческим причинам. Я не на 100% уверен ни в ком, тем не менее, кроме модификаторов. вышеупомянутое –  strugee 04.12.2013, 09:14
  • 2
    должно, вероятно, быть отредактировано в ответ. –  strugee 04.12.2013, 09:14
  • 3
    связал обсуждение в чате: Примечание chat.stackexchange.com/transcript/message/12481097#12481097 –  strugee 05.12.2013, 02:59

Клавиатуры отправляют события на компьютер. Событие говорит “скэн-код nnn вниз” или “скэн-код nnn”. В другом конце цепочки приложения, работающие в терминале, ожидают вход в форме последовательности символов. (Если они не запросили необработанный доступ, как X-сервер делает.) При нажатии A клавиатура отправляет информацию “скэн-код 38 вниз”. Консольный драйвер ищет свою контурную карту и преобразовывает это в “символ a” (если никакая модифицирующая клавиша не нажимается).

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

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

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

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

Дополнительно некоторые функциональные клавиши не могут быть отображены в Вашей консоли.

Для подобного представления в GUI посмотрите то, Что метаклавиша удара?

19
27.01.2020, 19:37

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

  1. Аппаратные средства клавиатуры отправляют "скэн-коды", но они переведены и представлены приложениям уровня командной строки как символы. Ключ A становится единственным байтом: A если клавиша Shift снижается (или Блокировка Сдвига), a иначе.

  2. В совместимом ANSI терминале клавиши со стрелками не отправляют отдельный символ (нет никаких кодов для стрелок в наборе символов ASCII), но "escape-последовательность" с 3 символами: escape-[-A. Другие три клавиш со стрелками escape-[-B, C, D.

  3. Та же последовательность символов переместила бы курсор вверх одной строкой, если отправлено (echo'ed) к старому физическому терминалу ANSI. Много программ, включая эмуляторы терминала, распознают эти последовательности символов и делают что-то соответствующее: эмуляторы терминала переместят курсор вверх (это то, как curses библиотека перемещает курсор), но bash прервет его и прокрутит историю вместо этого.

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

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

5
27.01.2020, 19:37

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

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

В странице руководства удара говорится под 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),

3
27.01.2020, 19:37
  • 1
    Ваш ответ о другой вещи, потому что приглашение ко входу в систему печатается и обрабатывается login, который не связан с bash. –  Risto Salminen 04.12.2013, 09:55
  • 2
    bash и login пользуются той же библиотекой (readline) для редактирования строк. Различие - просто это login не делайте interprete ключи вертикальной стрелки как команда, как bash делает. –  chaos 04.12.2013, 11:16
  • 3
    Да, я допускаю это. –  Risto Salminen 04.12.2013, 12:53
  • 4
    Синтаксис удара предназначен для сходства с ^[ представление escape, но они - разные вещи. Bash, возможно, использовал любой синтаксис вообще. На самом деле, когда Вы пишете \[A, выводы удара три символа: ^[ (т.е. Escape), [, A. –  alexis 11.12.2013, 11:47

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

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

0
27.01.2020, 19:37

Командная оболочка, например Bash, — это программа, переводящая стрелку вверх в действие «извлечь предыдущую команду». У вас не запущена командная оболочка.

0
27.01.2020, 19:37

TLDR

Возможно, вы используете sh, который выводит необработанные коды клавиш, сгенерированные при нажатии клавиши со стрелкой вверх.

Более продвинутая оболочка, такая как bash, перехватывает эти коды клавиш и что-то с ними делает. Например. показать последнюю команду в своей истории.

Чтобы устранить проблему, введите bashдля входа в оболочку bash. Затем используйте команды со стрелками вверх/вниз (обратите внимание, ваша история начнется заново в новой оболочке ).

8
27.01.2020, 19:37

Теги

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