Оптимизируем процесс работы в консоли

Все привыкли редактировать текст в текстовых редакторах, блокнотах, веб-формах и т.д. В процессе набора текста мы пользуемся привычными стрелками, кнопками «End» и «Home», более опытные зажимают «Ctrl» и стрелками шагают по словам (что, кстати, не всегда работает). И при переходе на консоль мы ориентируемся на те же самые правила, даже не зная, что bash предлагает очень удобные средства и комбинации клавиш, которые очень упрощают работу и минимизируют количество операций для выполнения задачи. К тому же, в bash есть удобные средства работы с историей, масса различных подстановок и других интересных функций. Самые часто используемые мной и любым опытным администратором я и опишу в этой статье.

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

Операции относительно курсора

По привычке, для перемещения в начало строки используется кнопка «Home», а для перемещения в конец — кнопка «End». Но на сколько удобно тянуться к этим кнопкам при наборе команды? Bash предлагает не отрываться от буквенно-цифровой клавиатуры и использовать комбинации «Ctrl+A» вместо «Home» и «Ctrl+E» вместо «End». Иногда, набрав длинную команду, вспоминаешь, что перед ней нужно было выполнить еще одну: в этом случае оптимальным способом будет переместиться по «Ctrl+A» в начало строки, дописать символ "#" (тем самым закомментировав команду, но оставив ее в истории), и нажав Enter, после чего можно выполнить нужную команду, в истории найти закомментированную команду, убрать символ комментария и выполнить ее.

Чтобы очищать текст до или после курсора используются комбинации клавиш: «Ctrl+K» — удаление текста от текущей позиции курсора до конца строки, а «Ctrl+U» — до начала строки. Ну и наконец, по «Ctrl+C» можно удалить сразу всю строку.

Можно удалять сразу слова: «Ctrl+W» удаляет слово слева от курсора, «Alt+D» — справа. Но удаленные слова еще и помещаются в буфер, последнее удаленное слово можно вставить начиная с текущего положения курсора по комбинации «Ctrl+Y».

Часто в спешке можно набрать 2 символа в не правильной последовательности: в этом случае удобно воспользоваться комбинацией клавиш «Ctrl+T», которая предназначена для замены местами символа до курсора и символа под курсором.

История

Обычно познания подсистем истории bash ограничиваются стрелками вверх и вниз. В работе удобно использовать еще следующие возможности:

  • Восклицательный знак. Вызывает какую-то команду из истории, а сама история выводится в пронумерованном виде на экран по команде history. Например: выполнить пятую команду из истории можно набрав "!5", а пред-предыдущую по "!-2". Предыдущая же команда вызывается по "!!", а первая команда в списке (в обратном порядке), начинающаяся на «ro» — при помощи комбинации "!ro".
  • Переменные и подстановки. Очень часто нужно в новую команду вставить последний аргумент предыдущей. Яркий пример: по команде ls посмотрели содержимое далекого каталога, и требуется в него перейти. Не писать же опять полный путь? Здесь можно использовать подстановку "!$", наследованную из C shell, или родную переменную "$_". Вместо обеих будет подставлен последний аргумент предыдущей команды. Единственный минус — его нельзя будет посмотреть и подредактировать. В этом случае целесообразно использовать комбинацию «Alt+.», которая вставит нужный аргумент в текущее положение курсора, и можно делать с ним что угодно. Стоит так же заметить, что если последний аргумент предыдущей команды представляет собой маску(wildcard), то вместо подстановки "!$" будет использоваться весь текст, соответствующий этой маске, а не последний элемент. Можно так же получать и первый аргумент предыдущей команды, для этого используется подстановка "!^", но на практике это используется реже. Опечатку в предыдущей строке можно исправить не копаясь в ней: операция замены "^^" позволяет заменить текст предыдущей команды на новый и выполнить новую команду. Например:

[vorb@localhost ~]$ ls -l /dev/dsals: невозможно получить доступ к /dev/dsa: Нет такого файла или каталога[vorb@localhost ~]$ ^dsa^sdals -l /dev/sdabrw-rw---- 1 root disk 8, 0 Апр 5 03:18 /dev/sda

Здесь ошибочная запись «dsa» прошлой команды заменена на корректную «sda», и новая команда выполнена успешно.

Перемещение по файловой системе

Командой «cd», как и авто дополнением по кнопке «TAB» уже никого не удивишь. Но часто приходится «бегать» по всей файловой системе с необходимостью потом вернуться назад. Здесь пригодится основанный на модели стека механизм bash, который поддерживается командами pushd и popd: pushd выполняет переход в целевой каталог и занесение абсолютного пути предыдущего каталога в стек, а popd — наоборот, выбирает из стека предыдущий путь и переходит в него. Пример:
[vorb@localhost ~]$ pushd /var/cache/urpmi/rpms//var/cache/urpmi/rpms ~[vorb@localhost rpms]$ pushd /etc/urpmi/mediacfg.d/Cooker-2010.0-i586//etc/urpmi/mediacfg.d/Cooker-2010.0-i586 /var/cache/urpmi/rpms ~[vorb@localhost Cooker-2010.0-i586]$ popd/var/cache/urpmi/rpms ~[vorb@localhost rpms]$ popd~[vorb@localhost ~]$

В этом примере я сначала перешел в каталог с кэшем urpmi, потом в каталог с конфигами urpmi, затем вернулся назад в каталог с кэшем, и домой. Одна из самых распространенных задач, решаемых с использованием этого механизма: перейти в каталог с конфигами, затем в каталог с кэшем, с логами, или чем либо еще, и иметь возможность быстро вернуться назад.
Кстати, команда «cd» тоже имеет свои хитрости: «cd» без параметров сменит каталог на домашний, «cd ~user» — на домашний каталог пользователя user.

В принципе, это все, о чем я хотел рассказать в рамках этой статьи. Конечно, это далеко не все, и, если есть желание развивать знания в этом направлении, рекомендую книгу Джерри Пика, Тима О'Райли и Майка Лукидиса «UNIX: Инструментальные средства». В ней описан не только bash, но и C shell, и ksh, и сколько я ее читаю — всегда нахожу что-то новое для себя.
Успехов!

via Vorb at habrahabr

Комментарии (7)

+9
picaro - 7 Апрель, 2011 - 11:51
Изображение пользователя picaro.

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

В большинстве Linux систем стандартной коммандной оболочка является Bash (Bourne-Again Shell). Есть несколько удобных горячих главиш, которые рекомендуется запомнить и использовать при работе с коммандной строкой и которые позволяют сэкономить кучу времени при наборе и редактировании команд.

  • Ctrl + a Возвращает курсор в начало текущей строки
  • Ctrl + e Курсор в конец текущей строки
  • Ctrl + l Очищает экран от текста, аналог команды clear
  • Ctrl + h Работает как и Backspace (удаление предыдущего символа)
  • Ctrl + r Поиск по набранным ранее командам
  • Ctrl + c Убить выполняемый процесс
  • Ctrl + d Выйти из текущей оболочки (shell)
  • Ctrl + z Перевод выполняемой задачи в фоновый режим. Команда fg возвращает задачу обратно.
  • Ctrl + w Удаляет слово перед курсором
  • Ctrl + u Вырезать текст (в буфер) от начала строки и до позиции курсора. Если курсор в конце строки - убирает в буфер всю строка целиком.
  • Ctrl + k Вырезать текст (в буфер) от позиции курсора и до конца строки. Если курсор в начале строки - убирает в буфер всю строка целиком.
  • Ctrl + y Вставить строку из буфера, вырезанную командой Ctrl + k или Ctrl + u
  • Ctrl + t Меняет два символа перед курсором местами (удобно при опечатках)
  • Alt + t Меняет два слова перед курсором местами
  • Ctrl + xx Переносит курсор к началу строки от текущей позиции, и обратно
  • Alt + f Сдвигает курсор на одно слово вперед на текущей строке
  • Alt + b Сдвигает курсор на одно слово назад на текущей строке
  • Alt + . Добавляет последний аргумент предыдущей команды (пример: mkdir temp, затем cd Alt+.)
  • Alt + / Попытаться дополнить до имени файла
  • Alt + c Заменить букву под курсором на заглавную (capitalize)
  • Alt + l Заменить букву под курсором на строчную (lowercase)
  • Tab Автодополнение команд и имен файлов
  • Tab Tab Показать доступные варианты автодополнения

Вместо клавиши Alt, которая не работает на некоторых терминалах (например, при ssh сессии), можно использовать клавишу Esc. При этом нажимать необходимо последовательно - Esc, затем t. Вместо клавиши Esc можно нажать комбинацию Ctrl + [, это удобно, если у Вас клавиша Ctrl расположена слева от латинской буквы A.

Нагло содрано отсюда: Горячие клавиши в Bash

0
roman_k - 31 Июль, 2011 - 05:03
Изображение пользователя roman_k.

Давно хочу узнать, как можно (желательно, быстро - хоткеем или простой командой) отключать/включать отображение текущего каталога перед командной строкой: roman@desktop1:~/sources$ или roman@desktop1:/usr/bin$, например.

А то иногда - видеть, в каком каталоге находишься, необходимо, а в случаях, когда это не критично, а путь длинный, ужасно неудобно.

0
KB - 31 Июль, 2011 - 10:31

pwd - отображает полный путь до текущего каталога. Не совсем отключать/включать отображение текущего каталога перед командной строкой, но удобно.

0
roman_k - 31 Июль, 2011 - 16:17
Изображение пользователя roman_k.

Это-то, да; как без этого. Но, когда запутываешься в своём местонахождении, обычно даже не думаешь, что можешь находиться не там, где кажется... Соответственно, перепроверить просто в голову не приходит. Закон подлости :)

Иногда единственный выход, чтобы само глаза мозолило; но иногда - глаза мозолит слишком...

0
roman_k - 31 Июль, 2011 - 17:07
Изображение пользователя roman_k.

Чтобы было более понятно, о чём, вообще речь-то идёт...

Обычно то, что идёт перед приглашением командной строки, правится так: bash-prompt-tuning на Убунтологии. Но лезть за этим каждый раз в записи мне лень, а пользуюсь (опять же, по причине лени) слишком редко, чтобы запомнить наизусть, и набирать - на автомате.

Посему, интересуюсь методами убыстрения и упрощения сего действия.

0
Гость - 13 Октябрь, 2013 - 12:14

Используй команду alias . Она для сокращения команд

0
balamutick - 1 Август, 2011 - 05:24
Изображение пользователя balamutick.

Всё хорошо. Но только для текст надо получше отформатировать. То что давно искал, но с наскоку на такой большой текст не наскочить, "много букв", а отдельные отрезки не выделить.

Получше, чем даже на самом хабре.

P.s. это не придирка, это примечание. Было бы время, попробовал бы в спойлере реализовать, что имею ввиду.