Все привыкли редактировать текст в текстовых редакторах, блокнотах, веб-формах и т.д. В процессе набора текста мы пользуемся привычными стрелками, кнопками «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/dsa
ls: невозможно получить доступ к /dev/dsa: Нет такого файла или каталога
[vorb@localhost ~]$ ^dsa^sda
ls -l /dev/sda
brw-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, и сколько я ее читаю — всегда нахожу что-то новое для себя.
Успехов!