Чи є якась причина, чому я отримую ^ [[A, коли натискаю стрілку вгору на екрані входу в консоль?


32

Щоразу, коли я за входом у консоль, upнавмисно натискаю стрілку, щоб побачити раніше введені команди. Але я це бачу ^[[A.

Але коли я натискаю Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Winклавіші, не повторюються жодні символи.

Що може бути причиною позаду?

Чи ^[[Aщось із символів означає щось?

введіть тут опис зображення

Відповіді:


20

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


3
@RubanSavvy Ctrl, Alt та Win (їх часто називають Super у світі GNU / Linux) - модифікатори. Якщо натиснути їх і клавішу, на екрані ви побачите щось інше. Блокування прокрутки, я підозрюю, інтерпретується ядром або чимось іншим низьким рівнем, для контролю tty, хоча я не впевнений. Сторінка вгору і вниз, ймовірно, проковтнута gettyабо login, хоча я не впевнений, чому. Освічені здогадки говорять, що екран друку спеціально інтерпретується ядром з історичних причин. Я не впевнений на 100% в будь-якому, окрім модифікаторів.
strugee

3
вище, мабуть, слід відредагувати відповідь.
струг

пов'язана дискусія в чаті: chat.stackexchange.com/transcript/message/12481097#12481097
strugee

19

Клавіатури надсилають події на комп’ютер. Подія говорить "сканувати код nnn вниз" або "сканувати код nnn вгору". На іншому кінці ланцюга програми, що працюють в терміналі, очікують введення у вигляді послідовності символів. (Якщо тільки вони не вимагали необробленого доступу, як це робить сервер X.) Коли ви натискаєте A, клавіатура надсилає інформацію "сканувати код 38 вниз". Драйвер консолі шукає свою картуa клавіш і перетворює це на "символ " (якщо не натискається клавіша модифікатора).

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

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

Якщо натиснути Upна запит на оболонку, це надішле вам таку саму 3-х символьну послідовність. Оболонка інтерпретує це як послідовність команд (як правило, для згадування попереднього елемента історії). Якщо натиснутиCtrl +, Vто Upв запиті оболонки, це додасть послідовність відходу в запиті: Ctrl+ V- це команда вставити наступний символ буквально замість того, щоб інтерпретувати його як команду, тому символ не інтерпретується як початок послідовності втечі .

Деякі клавіші є лише модифікаторами і не передаються термінальним додаткам. Наприклад, коли ви натискаєтеShift , ця інформація залишається в драйвері терміналу і враховується, якщо потім натиснути A, тож драйвер надсилає Aпрограму замість a.

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

Для подібного перегляду в графічному інтерфейсі див. Що таке мета-ключ bash?


Це чудова відповідь, дякую Жиллю, як завжди.
ДжошуаРЛІ

5

Справа не в тому, як ключі представлені "терміналом" (тобто додатком емулятора терміналу). Те, що ви бачите, - це ANSI-код ( послідовність відходу ANSI ) для переміщення вгору на один рядок, але переведений у форму для друку.

  1. Апаратне забезпечення клавіатури надсилає "скануючі коди", але вони перекладаються та подаються програмам рівня командного рядка як символи. Ключ Aперетворюється на один байт: Aякщо клавіша Shift вниз (або Блокування Shift), в aіншому випадку.

  2. В ANSI-сумісний термінал, клавіші зі стрілками , не відправити одного символу (там немає кодів для стрілок в наборі символів ASCII), а 3-символьний «послідовність»: escape-[-A. Інші три клавіші зі стрілками є escape-[-B, C, D.

  3. Ця ж послідовність символів перемістить курсор на один рядок, якщо він буде надісланий (відлунне) до старого фізичного терміналу ANSI. Багато програм, включаючи емулятори терміналів, розпізнають ці послідовності символів і роблять щось відповідне: емулятори терміналів перемістять курсор вгору (саме так cursesбібліотека переміщує курсор навколо), але bashперехопить його та замість цього прокрутить історію.

  4. Щоб курсор не закінчувався в усіх програмах, які не користуються переміщенням курсору по екрану, ви часто будете бачити ESC на вводі клавіатури, який відображається як послідовність для друку ^[(тому що відповідь відповідає control-[). Це фактично обробляється інтерфейсом термінального пристрою; див stty(1). Як результат, стрілка вгору відображатиметься як ^[[A. Це ви побачите з командного рядка, якщо набираєте cat, натискаєте return і натискаєте деякі клавіші зі стрілками. Це також ви побачили на екрані входу в консоль.

Нарешті: Control, Alt, і інші ключі ви згадали , не відображаються в послідовності символів. Вони впливають на символ, надісланий іншим натисканням клавіші (наприклад, a/ Aприклад вище), або у них просто немає відображення тексту. Такі натискання клавіш можуть виявити лише програми, які слухають події на клавіатурі. Їх неможливо побачити, читаючи зі стандартного вводу (або записуючи у файл).


3

Ця поведінка відрізняється від оболонки до оболонки. Більшість оболонок використовують бібліотеку, яка називається readlineдля редагування рядків у запиті. Ось повна довідкова команда для цієї бібліотеки, тому коли програма використовується, readlineви можете редагувати та переходити до рядків за допомогою цих команд.

Вертикальні клавіші зі стрілками конфігуруються у рядку читання для переміщення по історії команд. І в запиті входу немає історії команд. Ось чому символи ^[[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

Послідовності виходу для клавіш зі стрілками в ANSI є:

  • [ValueAКурсор вгору (де Valueможе бути порожнім)

  • [ValueBКурсор вниз (де Valueможе бути порожнім)


5
Ваша відповідь стосується іншої речі, оскільки запит на вхід друкується та обробляється login, що не пов'язано з цим bash.
Risto Salminen

1
bashі loginвикористовуєте ту саму бібліотеку (лінію читання) для редагування рядків. Різниця полягає лише в тому, loginщо не інтерпретують вертикальні клавіші зі стрілками як команду, як bashце робиться.
хаос

Так, я це визнаю.
Risto Salminen

Синтаксис bash призначений так, щоб виглядати як ^[представлення escape, але вони різні речі. Bash взагалі міг використовувати будь-який синтаксис. Справді, коли ви пишете \[A, баш видає три символи: ^[(тобто втеча), [, A.
alexis

0

Це коди втечі ANSI . ^[- позначення, які використовує оболонка для відображення ESCбайта (байт ASCII 27). Отже, ваш приклад - байт ESC, за яким йде текст [A. Як ви бачите у статті Вікіпедії, ^[[( ESCдалі [) вводить контролер послідовності управління або CSI. CSI Aозначає перемістити курсор вгору на один стовпець.

Якщо ви хочете побачити код терміналу в терміналі, введіть CTRL + V, а потім іншу послідовність клавіш. Наприклад, CTRL + V, за яким слідує стрілка вгору ^[[A.


0

Командна оболонка, наприклад, Bash - це програма, яка переводить стрілку вгору на дію "отримати попередню команду". У вас не працює командна оболонка.


0

TLDR

Ви, ймовірно, працюєте, shякий виводить необроблені ключові коди, створені при натисканні клавіші зі стрілкою вгору.

Більш просунута оболонка, схожа на bashперехоплення цих клавішних кодів, робить щось із ними. Наприклад, показати останню команду в її історії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.