Одна возможная причина - то, что оболочка по умолчанию myusername не является ударом.
Можно проверить оболочку текущего пользователя с:
echo ${SHELL}
echo $0
Для изменения пользовательской оболочки, постоянно посмотрите man chsh
, например:
chsh -s /bin/bash
Это - способ, которым терминал представляет необработанный код клавиши ключ, отправленный в него клавиатурой. В основном Ваша оболочка обычно прерывала бы нажатие клавиши, но там не имеет отношения это при приглашении ко входу в систему. Таким образом, символ, который Вы ввели, печатается к консоли точно так же, как любая другая буква (или число, или безотносительно).
Клавиатуры отправляют события на компьютер. Событие говорит “скэн-код 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 посмотрите то, Что метаклавиша удара?
Это не о том, как ключи представлены "терминалом" (т.е. приложение эмулятора терминала). То, что Вы видите, является кодом ANSI (escape-последовательность ANSI) для перемещения вверх одной строки, но переведенный в печатаемую форму.
Аппаратные средства клавиатуры отправляют "скэн-коды", но они переведены и представлены приложениям уровня командной строки как символы. Ключ A становится единственным байтом: A
если клавиша Shift снижается (или Блокировка Сдвига), a
иначе.
В совместимом ANSI терминале клавиши со стрелками не отправляют отдельный символ (нет никаких кодов для стрелок в наборе символов ASCII), но "escape-последовательность" с 3 символами: escape-[-A
. Другие три клавиш со стрелками escape-[-B, C, D
.
Та же последовательность символов переместила бы курсор вверх одной строкой, если отправлено (echo'ed) к старому физическому терминалу ANSI. Много программ, включая эмуляторы терминала, распознают эти последовательности символов и делают что-то соответствующее: эмуляторы терминала переместят курсор вверх (это то, как curses
библиотека перемещает курсор), но bash
прервет его и прокрутит историю вместо этого.
Чтобы постараться не иметь курсор заканчиваются повсеместно в программах, которым не нравится перемещение курсора вокруг экрана, Вы будете часто видеть ESC во вводе с клавиатуры, отображенном как печатаемая последовательность ^[
(потому что Escape соответствует control-[
). Это на самом деле обрабатывается интерфейсом оконечного устройства; посмотрите stty(1)
. В результате стрелка вверх обнаружится как ^[[A
. Вы будете видеть это из командной строки, если Вы введете cat
, возврат хита и нажатие некоторые клавиши со стрелками. Это также, что Вы видели на консольном экране входа в систему.
Наконец: Управление, Высокий звук и другие ключи, которые Вы упомянули, не отображаются на последовательности символов. Они влияют на символ, отправленный другим нажатием клавиши (как a
/A
пример выше), или у них просто нет отображения для отправки текстовых сообщений. Такие нажатия клавиш могут только быть обнаружены программами, которые прислушиваются к событиям клавиатуры. Они не могут быть замечены путем чтения из стандартного входа (или записаны в файл).
Этот 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),
login
, который не связан с bash
.
– Risto Salminen
04.12.2013, 09:55
bash
и login
пользуются той же библиотекой (readline) для редактирования строк. Различие - просто это login
не делайте interprete ключи вертикальной стрелки как команда, как bash
делает.
– chaos
04.12.2013, 11:16
^[
представление 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
.
Командная оболочка, например Bash, — это программа, переводящая стрелку вверх в действие «извлечь предыдущую команду». У вас не запущена командная оболочка.
TLDR
Возможно, вы используете sh
, который выводит необработанные коды клавиш, сгенерированные при нажатии клавиши со стрелкой вверх.
Более продвинутая оболочка, такая как bash
, перехватывает эти коды клавиш и что-то с ними делает. Например. показать последнюю команду в своей истории.
Чтобы устранить проблему, введите bash
для входа в оболочку bash. Затем используйте команды со стрелками вверх/вниз (обратите внимание, ваша история начнется заново в новой оболочке ).
getty
илиlogin
, хотя я не уверен почему. Образованное предположение говорит, что экран печати интерпретируется особенно ядром по историческим причинам. Я не на 100% уверен ни в ком, тем не менее, кроме модификаторов. вышеупомянутое – strugee 04.12.2013, 09:14