Горячие клавиши bash

Я решил потрясти интернет на предмет горячих клавиш shell – а то кроме <Ctrl>-R особо ничем не пользовался. Информации оказалось довольно много, но в разных местах – разная и иногда даже противоречивая. Так что пришлось переводить, проверять работу и систематизировать. Зато список получился довольно объёмным, теперь даже сам буду пользоваться 🙂

Горячие клавиши bash можно разделить на несколько больших групп:

CTRL-команды:

Ctrl + a – переход к началу строки
Ctrl + b – аналог стрелки влево (ну, если не работает)
Ctrl + c – отменить редактирование команды или прекратить работу (если запущена)
Ctrl + d – аналог Delete. Если строка пустая – выход из shell
Ctrl + e – переход к концу строки
Ctrl + f – аналог стрелки вправо
Ctrl + g – выход из режима дополнения
Ctrl + h – аналог BackSpace
Ctrl + i – аналог Tab
Ctrl + k – удалить всё до конца строки
Ctrl + l – Очистить экран (набранная строка и даже позиция курсора остаётся)
Ctrl + r – (ну, это все знают) – поиск по истории набранных команд
Ctrl + R – поиск по истории набранных команд назад (это когда есть несколько вариантов и проскочили нужный)
Ctrl + t – поменять местами текущий символ с предыдущим
Ctrl + u – удалить всё до начала строки
Ctrl + v – преобразует следующую клавишу в её символьное отображение (Enter – ^M, Esc – ^[ и т.д.)
Ctrl + w – удалить от курсора до начала слова
Ctrl + x дважды – скачок между началом строки и текущей позицией курсора.
Ctrl + x @ – Показывает возможные варианты дополнения доменного имени (вот это мне воспроизвести не удалось).
Ctrl + y – вставить из буфера (все удаляемое по горячим клавишам удаляется не просто так, а в буфер)
Ctrl + z – притормозить/остановить выполнение команды в фон
Ctrl + _ – отмена последнего изменения

ALT-команды
Alt + < – к первой команде в истории (вообще к самой первой в .bash_history)
Alt + > – к последней команде в истории
Alt + ? – показать весь список вариантов дополнения (аналог 2Т – см. ниже)
Alt + * – вставить все возможные варианты дополнения
Alt + / – попытатся дополнить имя файла (из имеющихся в текущем каталоге)
Alt + . – вставить последний аргумент из предыдущей команды
Alt + b – влево на слово
Alt + c – сделать первую букву слова заглавной (и перейти к следующему слову)
Alt + d – удалить от текущей позиции до конца слова
Alt + f – вправо на слово
Alt + l – сделать первую букву слова строчной (и перейти к следующему слову)
Alt + n – искать по истории (но не сразу, а после полного ввода и нажатия Ентер)
Alt + p – искать по истории назад
Alt + r – очистить всю строку
Alt + t – поменять слова местами
Alt + u – сделать все буквы заглавными от текущей позиции до конца слова
Alt + BackSpace – Удалить от текущей позиции до начала слова

Esc-команды
Esc+d – удалить от курсора до конца слова
Esc+f – вправо на слово
Esc+b – влево на слово
Esc+t – поменять местами слова

Tab-команды

2T обозначает дважды нажатый Tab
2T – все доступные команды (это тоже все знают)
(string)2T – все доступные команды начинающиеся на string
/2T – все каталоги, включая скрытые. Для текущего надо набрать ./2Т
*2T – каталоги, кроме скрытых
~2T – все пользователи, присутствющие в /etc/passwd
~f2T – все пользователи, присутствющие в /etc/passwd, начинающиеся на f
$2T – все системные переменные
@2T – все записи в /etc/hosts
=2T – вывод наподобии ls или dir

Просто команды 🙂
!! – выполнить последнюю команду в истории
!abc – выполнить последнюю команду в истории, начинающуюся на abc
!a:p – напечатать последнюю команду в истории, начинающуюся на a
!n – выполнить n-ную команду в истории
!$ – посдедний аргумент последней команды
!^ – первый аргумент последней команды (прямо “старший помощник младшего дворника” 🙂 )
^abc^xyz – заменить abc на xyz в последней команде и выполнить результат

Интересно, удастся ли найти ещё что-то? 🙂

Горячие клавиши bash: 6 комментариев

  1. молодец, сам думал над составлением такого списка, но как-то руки не дошли 🙂

    Теперь по пунктам.

    Информации оказалось довольно много, но в разных местах – разная и иногда даже противоречивая

    места такие, в порядке возрастания приоритетности:
    man 3 readline (библиотека, предоставляющая средства работы с командной строке в bash и некоторых других CLI-утилитах, например, в psql; примерный список в rpm-based дистрибутивах можно посмотреть с помощью команды rpm -q –whatrequires libreadline.so.5)
    man 1 bash (использует статически слинкованную библиотеку readline с добавлением своих фич)
    /etc/inputrc, ~/.inputrc (переопределяет биндинги кнопок, в некоторых дистрибутивах весьма существенно)

    Ctrl + x @ – Показывает возможные варианты дополнения доменного имени (вот это мне воспроизвести не удалось).

    имена хостов берутся из /etc/hosts, там должно быть что-нибудь написано в правильном формате. Можно расширить до .ssh/known_hosts с помощью complete -j

    Просто команды

    ну это уже не комбинации клавиш в общепринятом смысле 🙂 и вообще работа с историей команд в баш большая отдельная тема

    Интересно, удастся ли найти ещё что-то? 🙂

    Без сомнения, удастся! man bash и man builtins можно пересказывать бесконечно!

    Пользуясь случаем, попиарю свой пост про то, как работает автодополнение в bash, а заодно порекомендую пакет bash-autocompletion (должен быть доступен во всех дистрибутивах, а в ubuntu так вообще по умолчанию включен) для реально охрененного автодополнения.

    • Ну, по поводу ssh – помнится, поставил я какой-то файлик, который теперь из known_hosts в ssh, ping и traceroute по Tab дополняет имена хостов. Уже и не помню, что и куда клал 🙂

      А твой пост про автодополнение я заложил в закладки и собираюсь читать долгими зимними вечерами 😉

  2. вот, еще из полезного:

    # echo a b c d
    a b c d
    # echo 1 !*
    echo 1 a b c d # bash показал результат history expansion
    1 a b c d # результат выполнения команды

    т.е. !* показывает все аргументы последней команды

    можно вот так использовать:
    # ech ab cd # намеренно допустили ошибку
    bash: ech: command not found
    # echo !*
    ab cd

  3. Уведомление: Волшебные alias’ы | Flycat.Info | КОТорый летает сам по себе...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *