Вопрос о поведении контрольных клавиш

Я смущен тем, как Ctrl-key работают в терминале. В man-странице bash существуют различные комбинации, такие как:

  • Ce – перейти к концу линии
  • Cf – перейти на один символ вперед

и т.п.

  • Как я могу исправить скрипт завершения табуляции имени хоста SSH?
  • Где я могу найти хорошую документацию для bash printf?
  • Как разрешить сценарию оболочки bash цикл для 3 повторений перед выходом (подсказка для имени пользователя / пароля)
  • Как перечислить n-й самый младший файл (без разбора ls!)
  • Почему мой tar в скрипте ведет себя иначе, чем использование tar вручную
  • Сценарий оболочки Bash / Korn, отредактированный в Windows, вызывает ошибку '... ^ M: not found'
  • Но есть некоторые недокументированные ярлыки, такие как:

    • Cj (OR Cm ) для ключа возврата.
    • Ch для backspace
    • Ci для вкладки и т. Д.

    Являются ли эти ярлыки просто забытыми для документирования? Или, потому что

    • CjLF
    • Cm является CR
    • CiTab

    в ASCII, это как-то «поведение по умолчанию»? Другими словами, является ли поведение Cj , Cm и Ci не реализованным bash, а чем-то другим?

    Другой вопрос, когда я Cv и стрелку влево, ^[[D появляется на экране. Т.е., ESC-[-d . Но когда я нажимаю ESC-[-d , курсор не перемещается влево. Что является причиной этого?

    РЕДАКТИРОВАТЬ:

    Первоначально я думал, что когда я 00001010 Cj , клавиатура напрямую отправляет 00001010 в ядро. Но потом я решил, что это не так, потому что, используя такие программы, как xev или evtest , я заметил, что evtest клавиши Control и j появляется как разные события. Поэтому, когда я 00001010 Cj , клавиатура не отправляет 00001010 , но, вероятно, несколько байтов. Затем, где выполняется преобразование этих нескольких байтов в 00001010 ?

  • какая оболочка будет использовать sudo для выполнения сценария оболочки без строки shebang
  • Проверка сценария оболочки с помощью моделирования терминала
  • Как использовать тройник для перенаправления на grep
  • rsync добавляет дополнительный каталог в команду
  • Отключить завершение вкладки bash
  • Лучшая практика использования $? в bash?
  • 2 Solutions collect form web for “Вопрос о поведении контрольных клавиш”

    Поведение Cm , Ci и т. Д. Реализуется bash, но тот факт, что они такие же, как Return , Tab и т. Д., Обусловлен поведением терминала. Все терминалы ведут себя так, потому что все терминалы всегда вели себя так, и это то, что ожидают приложения. Интерфейс между терминалом и приложением основан на символах (фактически, байтах), а не на ключах, поэтому ключи, которые не отправляют печатные символы и комбинации клавиш, должны каким-то образом кодироваться. См. Как работают ввод с клавиатуры и вывод текста? для получения дополнительной информации по этой теме. См. Также https://emacs.stackexchange.com/questions/1020/problems-with-keybindings-when-using-terminal

    TAB – это символ табуляции в ASCII , и это то же самое, что и символ Ctrl + I в ASCII. Аналогично другим клавишам. Терминалы отправляют этот символ, когда пользователь нажимает Tab и когда пользователь нажимает Ctrl + I. То же самое для RET (CR) и Cm , для LFD и Cj (что у большинства клавиатур нет), а для ESC и C-[ . Есть также BackSpace, который отправляет либо Ch либо C-? , это проблема сама по себе.

    Конфигурация терминала (настройки stty ) может дополнительно входить в игру, и это влияет на некоторые настройки bash (например, после stty erase @ , bash будет обрабатывать нажатие @ качестве BackSpace), но не Cm и Cj для отправки текущей строки.

    ^[[DEsc [ D , но с капиталом D Если вы нажмете Esc [ D , bash видит левую клавишу, из-за объявления escape-последовательностей клавиш курсора в базе данных termcap или terminfo . Не существует привязки по умолчанию для Esc [ d (это не escape-последовательность, которую посылают общие терминалы).

    Два вопроса, два вопроса:

    • control / J , control / M и control / I – обычные ASCII-элементы управления, которые большинство программ допускают. bash просто упрощает повторную привязку к readline.
    • большинство программ, которые принимают специальные клавиши, такие как стрелка влево, обеспечивают способ распознавания ключа эвакуации, отличного от этих специальных ключей по времени . Вероятно, вы не можете набирать достаточно быстро, чтобы вводить символы (за исключением особых случаев, таких как emacs, которые не учитывают время).

      Поскольку вы не набираете так быстро, программа видит отдельные символы, которые не будут перемещать курсор. Отдельные персонажи могут делать что-то интересное.

    Независимо от этого (замечая комментарий о опечатке, которую я пропустил в вопросе), ESC [ d является стандартной управляющей последовательностью, которая, если она отправляется на терминал, переместит курсор в верхнюю строку экрана:

     CSI Pm d Line Position Absolute [row] (default = [1,column]) (VPA). 

    Так как xterm реализует это , все, что притворяется точно так же, как xterm, будет делать то же самое, конечно. Консоль Linux тоже делает это. Однако bash обычно не выполняет контрольные последовательности: поведение, которое вы наблюдаете, было бы тем, что bash делает с экранами, которые он не распознает.

    Что касается форм-фидов (комментарий предполагает, что они являются частью вопроса): использование bash формы (для ввода ) для очистки экрана путает некоторых людей (включая разработчиков PuTTY), полагая, что терминалы должны интерпретировать форму-канал. Эта функция фактически исходит от линейных принтеров и изначально редко встречалась в терминалах, даже в разнообразии печати. Для некоторых связанных дискуссий см. Мои заметки о репататоре и последующих действиях для повторного использования этой функции.

    Linux и Unix - лучшая ОС в мире.