Горячие клавиши 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 не будет опубликован. Обязательные поля помечены *