Каретка квадратная скобка квадратная скобка A ^ [[A - Что это значит?

13

Извините, если об этом уже спрашивали, но я понятия не имею, как я могу это выяснить сам - когда я ищу "^ [[A" в любой поисковой системе, он полностью игнорирует часть "^ [[".

В любом случае, мой вопрос: иногда в терминале (на Mac), когда я нажимаю клавиши со стрелками, появляются символы «^ [[A», «^ [[B», «^ [[C» или «^ [[D» »). , Кажется, я помню, что сталкивался с этим несколько лет назад, когда использовал (скорее всего) DOS, и думаю, что это происходило гораздо чаще.

Почему это происходит и что они значат?

Phill
источник

Ответы:

20

Это управляющие коды ANSI . Символ ^[представляет ESC (escape-символ), следующий [- фактическая левая квадратная скобка, а буква обозначает функцию escape-кода. Эта Esc[часть называется CSI (вводная последовательность управления). Таким образом, последовательность CSI Aозначает стрелку вверх или CUU (CUrsor Up).

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

Обычно, когда вы нажимаете клавиши со стрелками, какая-то программа (скажем, оболочка) слушает и может воздействовать на них. Поэтому, когда вы нажимаете стрелку вверх, она прокручивается назад в историю ваших команд. Однако, если запущена программа, которая не понимает escape-последовательности для клавиш со стрелками, то они, как правило, в конечном итоге возвращаются в терминал, как любая другая клавиша, на которую вы можете нажать. Вот почему вы иногда видите, ^[[Aнажимаете ли вы клавишу со стрелкой вверх.

Грег Хьюгилл
источник
Стоит также отметить, что ^ является общим соглашением UNIX, показывающим «контроль» в терминале. Например, если вы нажмете Ctrl + A, и он будет проигнорирован таким же образом, он будет показан как «^ A». Ctrl + [на самом деле является синонимом escape-символа. Между прочим, что это делает это в первую очередь; какое программное обеспечение решает распечатать каретку? Это сам эмулятор терминала или что-то еще, о чем я не знаю?
Muzer
@Muzer само ядро ​​выполняет каретное форматирование отображаемых символов. stty -echoctl
Ядро? Интересно, я не знал, что это зашло так глубоко (хотя в ретроспективе это должно было быть очевидно, так как это происходит даже на очень ранних стадиях загрузки!).
Muzer