Почему терминал отображает "^ [[A" "^ [[B" "^ [[C" "^ [[D" при нажатии клавиш со стрелками в Ubuntu?

Сначала я написал крошечную программу на Ansi C для Windows и скомпилировал ее в Ubuntu со встроенным GCC.

Программа проста:

  • читать строку из консоли с scanf().
  • Проанализируйте строку и рассчитайте.

Но происходит нечто странное. Когда я пытаюсь переместить курсор, он печатает четыре символа:

  • нажатие Up печатает "^[[A"
  • нажатие Dn печатает "^[[B"
  • нажатие Rt печатает "^[[C"
  • нажатие Lt печатает "^[[D"

  • Как этого можно избежать?

  • Почему он печатает эти 4 символа вместо перемещения курсора?

Ответы

Ответ 1

Потому что то, что клавиатура фактически отправляет на ПК (точнее, что терминал печатает для того, что он фактически получает с клавиатуры). bash, например, получает эти значения, расшифровывает их и понимает, что вы хотите перемещаться, поэтому он будет либо перемещать курсор (в случае левого/правого), либо использовать его историю для извлечения предыдущих команд (вверх/вниз). Таким образом, вы не можете ожидать, что ваша программа магически поддерживает клавиши со стрелками.

Однако, чтение со стандартного ввода с терминала уже поддерживает клавиши со стрелками влево/вправо (я полагаю, но я не сейчас в Linux, чтобы проверить и убедиться). Поэтому я предполагаю, что есть другая проблема. Одна из возможных причин может заключаться в том, что один из ваших ключей-модификаторов застрял? Возможно, ALT, CTRL или SUPER?

Ответ 2

Для тех, кто идет из osx (mac), попробуйте изменить оболочки на bash

Terminal -> Preferences -> Shells open with -> [select] Command (complete path)

затем вставьте

/bin/bash

Ответ 3

Просто введите $ bash в терминале. Это решит проблему.