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

    Посвящается B_dot, пост которого заставил заинтересоваться возможностями консоли плотнее.
    cat /dev/cheat-sheet >> /dev/head

    Краткое вступление


    В этом посте будет рассказано о некоторых сочетания клавиш, которые могут упросить жизнь администраторам, работающим в консоли. Все они работают в bash'e. Сочетания клавиш я дополнительно проверял на циске (Cisco IOS Software, s72033_rp Software (s72033_rp-ADVIPSERVICESK9_WAN-M), Version 12.2(33)SXH4), csh и zsh. Рассмотренное в других записях повторять особо не буду. Сочетания сгруппированы по использованной функциональной клавише.
    Особенно полезен этот текст будет людям, которые любят использовать клавиши Home, End и Delete (которые в цисковой консоли «не работают»).

    Сочетания



    Сначала немного сочетаний клавиш с ctrl.

    Ctrl + a — переход в начало строки (cisco, csh, zsh)
    Ctrl + b — переход на 1 символ назад (cisco, csh, zsh)
    Ctrl + c — посылает программе SIGINT. Обычно, прерывает текущее задание (csh, zsh)
    Ctrl + d — удаляет символ под курсором (аналог delete) (cisco, csh, zsh)
    Ctrl + e — переход к концу строки (cisco, csh, zsh)
    Ctrl + f — переход на 1 символ вперёд (cisco, csh, zsh)
    Ctrl + k — удаляет всё, до конца строки (EOL, а не на экране!) (cisco, csh, zsh)
    Ctrl + l — очищает экран. Аналог команды clear. (csh, zsh)
    Ctrl + r — поиск по истории. Повторение поиска (листание результатов поиска). То есть инкрементальный поиск. (zsh)
    Ctrl + j — прекращает поиск и позволяет отредактировать найденную команду. Если поиск не производился, то аналогично нажатию return. (в zsh выполняет команду)
    Ctrl + t — меняет символ под курсором на предыдущий. Или, если хотите, тянет предыдущий символ к концу строки. (cisco, csh, zsh)
    Ctrl + u — удаляет все символы слева от курсора до начала строки. (cisco, в csh, zsh удаляет всю строку)
    Ctrl + w — удаляет символы слева от курсора до начала слова. (cisco, csh, zsh)
    Ctrl + xx — переходит от текущей позиции курса в начало строки и обратно. На циске работает аналогично ctrl + u. (csh)
    Ctrl + x @ — показывает возможные дополнения имени хоста (имена берутся из /etc/hosts)
    Ctrl + z — suspend'ит текущую задачу (csh, zsh)
    Ctrl + x; Ctrl + e — открывает $EDITOR для изменения введённой строки. После сохранения изменений, команда отправляется на исполнение. Если переменная не задана, то открывается системный текстовый редактор (для линукса это, зачастую, nano)

    Теперь немного о сочетаниях с альтом.

    Alt + < — переход к первой команде в истории команд (zsh)
    Alt + > — переход к последней команде в истории
    Alt +? — показывает список возможных дополнений команды(аналогично tab-tab) (в csh, zsh аналог which string)
    Alt + * — вставляет все возможные дополнений команды в строку команд
    Alt + / — пытается дополнить имя файла (аналогично табуляции)
    Alt +. — вставляет последний аргумент предыдущей команды (аналог !$, только не надо делать :p, чтобы проверить )
    Alt + b — сдвигает курсор влево на 1 слово (cisco, csh, zsh)
    Alt + c — делает букву под курсором большой, а остальные, до конца слова, маленькими. (cisco, csh, zsh)
    Alt + d — удаляет символы с текущей позиции курсора и до конца слова. (cisco, csh, zsh)
    Alt + f — передвигает курсор на одно слово вперёд (cisco, csh, zsh)
    Alt + l — делает все буквы с текущей позиции курсора и до конца слова маленькими (cisco, csh, zsh)
    Alt + t — меняет местами слова под курсором и предыдущее (zsh)
    Alt + u — переводит буквы с текущей позиции курсора и до конца слова в верхний регистр (cisco, csh, zsh)
    Alt + back-space — удаляет символы с текущей позиции курсора до начала слова (cisco, csh, zsh)

    В следующем абзаце я, для краткости, буду писать «2Т» чтобы обозначить двойное нажатие табуляции.

    2T — дополнение команды. Если нажать при пустой строке — выведет список всех доступных команд
    (string)2T — выведет список возможных дополнений
    (dir)2T — покажет подпапки папки dir
    *2T — покажет подпапки исключая скрытые (имена которых начинаются с точки)
    ~2T — выведет всех пользователей из /etc/passwd. Дополнив имя пользователя можно перейти в его домашний каталог. Например ~oxpa/ — домашний каталог пользователя oxpa
    $2T — выводит список дополнений для системных переменных
    @2T — дополняет имена хостов содержащимися в /etc/hosts
    =2T — листинг текущей директории, аналогичный ls.

    Небольшое заключение



    Так как в своей работе я чаще всего использую bash и cisco'вский шелл, то просто подписал сочетания, которые, я знаю, работают и для других шеллов. Возможности csh, zsh наверняка не меньше башевских, просто я меньше с ними работал.
    Вышеприведённый список будет неправильно показывать без пояснения: все эти горячие клавиши в bash'e можно переназначать. Есть действия, которые по умолчанию не назначены на горячие клавиши. Подобные «трюки» описаны в руководстве bash'a, которое я рекомендую прочитать всем заинтересовавшимся.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 59
    • +4
      полезный сборник, спасибо. Часть интуитивно знаешь, часть из опыта, но многие сокращения для меня стали открытием.
      • +3
        ну кроме полезных переходов в начала/конец строки, настоящим открытием стало «Ctrl + x; Ctrl + e»: я люблю иногда писать «однострочки» из команд 10, а без редактора это не всегда удобно (или становится неудобно, по мере написания ;). Вот однажды вычитал в мане, что эта моя проблема легко решается. Да и результат можно сразу сохранить в файлик.
    • +2
      Ох какая красота, надо раскрасить и на стенку бабахнуть. Спасибо.
      • +1
        Я пока набирал попробовал раскидать информацию по таблице или в каком-то формате более похожем на cheat-sheet, но для статьи здесь они не очень подошли. Всю статью можно свести к одной-двум картинками подобного вида, на самом деле. Но лучше при этом заранее прочитать более развёрнутое объяснение.
        • +1
          Нет я считаю хорошо у вас вышло, хоть и просто списком, но я не могу представить как это сделать еще лучше, схемой или чем-то.
    • +1
      >Ctrl + x; Ctrl + e
      о спасение
      как часто писал длинные команды, изменял их, правил… они потом превращались в не читаемый ужас, не влезая в терминал, но отдельно файл со скриптом создавать ещё лень… а вот как просто всё оказалось:)
    • 0
      zsh выводит список дополнений при одиночном нажатии Tab, а при последующих начинает перебирать их.
    • +6
      Это режим редактирования emacs. Существует еще и режим vi.

      set -o vi
      set -o emacs
      • 0
        Это не совсем правильный режим emacs, в zsh он куда правильней. Например, C-w «вырезает» регион, а не удаляет слово перед курсором и т.д.
      • 0
        !!! Большое спасибо, не знал, что оно уже встроено. Фантастически удобно.
    • +1
      Мега респект за Ctrl + x; Ctrl + e и Ctrl + xx :)
      • +1
        вместо Ctrl+xx всегда можно было использовать Home и End кнопками, кстати.
        • 0
          А как вернуться обратно?
        • 0
          Вы не верно поняли для чего эта горячая клавиша…
          Введите какую-нибудь команду, потом переместите курсор влево на несколько символов, нажмите ^xx (Ctrl+xx), попадете в начало строки, нажмите еще раз ^xx и попадете обратно, где были до этого.
          В этом и есть сила ^xx :))
    • +2
      Может кому будет полезно:
      Прерывание «текущего выполнения» — аналог Ctrl+C в Cisco:
      Ctrl+6
      • 0
        Ctrl+Shift+6
        Можно сменить на привычный Ctrl+C командой escape-character 3 на линии vty.
        • 0
          Спасибо, по поводу escape-character буду знать.
          Но Ctrl+6 у меня по-умолчанию работает на:
          cisco 2600, 7500, 2800, 7200, 7600.
          catalyst 3560, 3750G, 3750E.
          Так что думаю, можно и без Shift обойтись;)
    • 0
      Теперь я понял, почему пользователи FreeBSD использую zsh =)
      • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Да благословит вас всех святой emacs!
    • 0
      Спасибо большое. Вот только вопрос: можно ли баш научить по нажатию стрелки вверх перебирать из истории только те команды, начало которых совпадает с тем, что уже было набрано в строке непосредственно перед нажатием стрелки вверх? Так действует ipython и я нахожу это чрезвычайно удобным.
      • 0
        И fish.
      • +3
        Сделал так:

        в .bash_login
        if [ -f "$HOME/.inputrc" ] ; then
            export INPUTRC=$HOME/.inputrc
        fi
        


        в ~/.inputrc
        "\e[A": history-search-backward
        "\e[B": history-search-forward
        
        • 0
          в убунте лучше читать и править /etc/inputrc кстати говоря.
    • +5
      При чём тут разные шеллы? Это же readline делает.
    • 0
      Хмм… В симуляторе на Cisco IOS Alt+символ просто вводит символ. Попробую в вс на реальной железке, может не посчитали нужным добавить в симулятор. За Ctrl+a и Ctrl+e отдельное спасибо )
    • +4
      Возможно, мой комментарий будет полезен начинающим.

      Ctrl + z — suspend'ит текущую задачу (csh, zsh)


      Чтобы вернуться к таким задачам, используется команда fg.
      Если задач несколько, введите аргумент — число, стоящее в квадратных скобках вывода команды jobs:

      root@vpupkin# jobs
      [1] Остановлено vim
      [2]+ Остановлено nano
      [3]- Остановлено less /etc/hosts
      root@vpupkin# fg 2


      Для двух последних команд можно использовать '+' и '-'.
      • +1
        Остановлено vim
        Зачем, зачем переводить шелл? Мне вот приятнее читать английский, чем такую красоту.
        • 0
          Это вывод терминала Ubuntu (bash).
          Отвечай я на этот пост с FreeBSD, перевода не последовало бы.

          Признаюсь, самому больше нравится английский.
      • +1
        Ну и я тогда ляпну:

        Ctrl+\ — убьёт то, что не может быть остановлено по Ctrl+C, например если оно впадает в dead-lock на выходе.
        • 0
          ctrl + \ или ctrl + | посылает программе SIGQUIT и она выходит оставляя core dump. Кроме того, можно использовать сочетание клавиш ctrl + 4, если я правильно понял.

          Спасибо за комментарий, я не знал этого сочетания.
    • +1
      Как бы настроить Putty, чтобы он понимал виндовые сочетания клавиш для работы с кареткой? Ctrl+←, Ctrl+→, Ctrl+BckSp, Ctrl+Del

      Как бы научить screen прокручивать экран по нажатию клавиши, а не по адовому сочетанию из трех сочетаний (Ctrl+A, [, Ctrl+B)?
      • 0
        для zsh добавить строки ~/.zshrc
        #Ctrl+←,
        bindkey "^[OD" beginning-of-line
        # Ctrl+→
        bindkey "^[OC" end-of-line

        или для баша — как было выше, в .inputrc
        "\eOD": beginning-of-line
        "\eOC": end-of-line

        насчет Ctrl+BckSp, Ctrl+Del — не могу выловить сканкод, для ctrl+del должно быть действие «удалить от курсора до конца строки» — kill-line
        от Ctrl+BckSp — не понял
        • 0
          Подскажите, как забиндить Ctrl+Z. А лучше, как это определять для разных клавиш и сочетаний.

          Ctrl+BckSp — удаление последнего слова, тоже интересно.
        • 0
          В винде все привыкли к этому:

          Ctrl+← — переместить курсор на одно слово влево;
          Ctrl+→ — переместить курсор на одно слово вправо;
          Ctrl+BckSp — удалить слово слева от курсора;
          Ctrl+Del — удалить слово справа от курсора.

          Под словом понимается группа буквенно-цифровых символов, а также подчеркиваний, неразрывных пробелов и, возможно, чего-то еще.
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          Символ конца потока.
    • 0
      А есть ли комбинация, чтобы послать задачу в фон, не усыпляя её? А то делать ctrl+z а потом bg как-то не очень…
    • 0
      Я так адски страдала без ctrl+r. Спасибо вам.
    • 0
      Тем, кто хочет получить ещё больше экспириенса в работе с шеллом, советую поставить zsh а затем посмотреть grml-zsh-config с сайта дистрибутива grml и man-page zsh-lovers тоже с сайта grml. Там очень много интересных трюков.

      Например там есть подстановка по хоткею sudo в начало текущей строки, или, если строка пустая, в последнюю введенную комманду. Или хоткей для перехода в точку после первого слова в строке (для дописывания аргументов, например) и т.п., очень много функций облегчающих работу в шелле. Есть там и функция, которой можно заменить сочетание C-z, используемое для саспенда задачи. В версии grml, если активной задачи нет — выполняется fg.

      P.S. zsh самый навороченный shell, afaik
      • 0
        У меня он так тормозил, что пришлось вернуться к bash. Наверно, можно было просто отключить ряд фич, но тогда [для меня] терялся смысл использования zsh.
    • 0
      Огромное спасибо! Добавил все команды в виде комментариев в свой .bashrc. Теперь они всегда под рукой будут. Я как то редко консолью пользуюсь, но зато очень метко :) Поэтому такие шпаргалки необходимы.
    • +2
      Спасибо огромное! Ctrl+x,Ctrl+e вынес мой моск.

      От себя добавлю в копилку:

      <Esc>+. подставит последний аргумент из предыдущей команды.

      Пример:
      $ touch /tmp/testfile
      $ rm <Esc>+. превратится в rm /tmp/testfile
      
    • 0
      Это же Emacs режим
      • 0
        Кстати в Макоси комбинации вроде Ctrl-A, Ctrl-E работает в любом поле ввода
        о_О
        • +1
          Если скомандовать gconftool-2 --set /desktop/gnome/interface/gtk_key_theme Emacs --type string с консоли то в Gtk тоже будет везде, а так же в фаерфокс и хром
          • 0
            ухты, спасибо.
            а графическая настройка есть какая-то для этого?
    • 0
      а скажите как скопировать/вставить а bash?
      • 0
        например, это возможно через выход в текстовый редактор (если нужно скопировать и вставить часть команды). Однако по моему опыту, copy/paste редко нужен в консоли. Если что-то нужно сохранить используются переменные и простейшие скрипты для их обработки. Хотя, бывает, иногда проще руками ввести что-то с экрана.
      • +1
        Этим занимается эмулятор терминала. Например, для копирования текста в буфер нужно выделить его мышью, а для вставки — нажать среднюю кнопку.

        На самом деле буфера нет и всё происходит при нажатии средней кнопки мыши. При выделении только устанавливается окно-владелец PRIMARY SELECTION, но вам это не интересно. :) Единственное, что нужно помнить — при закрытии окна с выделением, оно теряется. Никакого промежуточного буфера нет.
    • +1
      Это, и многое другое, в скринкасте «Bash Command Line Editing» от Tim Harper
    • +1
      Кстати Ctrl+S это поиск по истории вперед, но он по умолчанию совпадает с управлением потоком. Добавте команды
      stty ixany
      stty ixoff -ixon

      В .bashrc
    • 0
      Ну хорошо бы в добавок ссылку на первоисточник дать Bindable Readline Commands — Bash Reference Manual

      Кстати раз уж про клавиши зашёл разговор, как в PuTTY передать Ctrl+Alt+Del?
    • 0
      Спасибо. Надо распечатать и повесить рядом с монитором.

      Офф: нет ли программы дополнения команд/имен файлов под Win? Привык уже к bash, а в Win как будто руки связаны :(
      • 0
        вообще, имена в cmd дополняются так же как в баше. По крайней мере я всегда пользовался табом и это срабатывало.
    • 0
      «Возможности csh, zsh наверняка не меньше башевских, просто я меньше с ними работал.»
      zsh самый навороченный по возможностям шел =)

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.