System Administration Toolkit: Максимальное использование оболочки bash

Оболочка Bash представляет собой популярную альтернативу исходным оболочкам Bourne и Korn. Она предоставляет множество дополнительных функций, включая расширенные методы применения псевдонимов для автоматического завершения различных команд, имен файлов и путей.

Мартин Браун, внештатный автор, консультант

Мартин Браун (Martin Brown) пишет статьи уже более семи лет. Он является автором многочисленных книг и статей по различным темам. Его квалификация охватывает множество платформ и языков разработки - Perl, Python, Java™, JavaScript, Basic, Pascal, Modula-2, C, C++, Rebol, Gawk, Shellscript, Windows®, Solaris, Linux, BeOS, Mac OS X и т.д., а также Web-программирование, системное управление и интеграция. Мартин является внутренним экспертом (SME) компании Microsoft® и регулярно пишет для ServerWatch.com, LinuxToday.com и IBM developerWorks. Он также принимает участие в блогах Computerworld, The Apple Blog и на других сайтах. Связаться с ним можно через его Web-сайт.



01.03.2007

О данной серии

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


История появления Bash

Оболочки в UNIX и Linux® обычно разделяются на две категории в соответствии с исходными оболочками, включенными в ранние версии UNIX.

Оболочка Bourne проще в использовании и более понятная в сравнении с оболочкой C shell, но она является менее практичной для программирования сложных сценариев. Оболочка Korn обеспечивает простоту использования оболочки Bourne и добавляет расширения для управления заданиями (позволяя упростить управление несколькими фоновыми заданиями), возможность журналирования и редактирования командной строки, также добавляет элементы оболочки С shell, позволяющие упростить программирование.

Оболочка Bourne-again (bash) представляет собой проект с открытым исходным кодом и объединяет принципы оболочки Bourne, среды программирования оболочки shell С, расширенные функциональные возможности оболочки Korn и различные собственные расширения, предоставляющие среду не только для программирования основных сценариев, но и интерактивную оболочку для управления и взаимодействия с системой.


Редактирование в командной строке и привязка клавиш

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

Функция редактирования позволяет перемещаться вперед и назад по отображаемой командной строке и выполнять изменения и исправления. В стандартной форме bash для основных перемещений используются клавиши-стрелки. Более сложные действия, например, переход на слово вперед или назад, управляются библиотекой Readline, которая по умолчанию поддерживается привязки для vi и emacs. Для перехода в режим редактирования задайте предпочтительный режим в командной строке или в файле начальной загрузки: $ set editing-mode emacs.

Например, в режиме редактирования emacs используются следующие привязки клавиш:

  • Control-A -- Переход в начало строки;
  • Control-E -- Переход в конец строки;
  • Control-K -- Удаление части команды от положения курсора до конца строки;
  • Meta-B -- Перемещение назад на одно слово;
  • Meta-F -- Перемещение вперед на одно слово;
  • Meta-D -- Удаление текущего слова.

Фактически, используя встроенную команду bash bind, можно связать любую клавишу или комбинацию клавиш с определенной операцией. Для начала можно получить список доступных команд с помощью параметра -P (см. листинг 1).

Листинг 1. Использование параметра -P для получения списка доступных команд
$ bind -P 

abort can be found on "\C-g", "\C-x\C-g", "\M-\C-g".
accept-line can be found on "\C-j", "\C-m".
alias-expand-line is not bound to any keys
arrow-key-prefix is not bound to any keys
backward-byte is not bound to any keys
...
yank can be found on "\C-y".
yank-last-arg can be found on "\M-.", "\M-_".
yank-nth-arg can be found on "\M-\C-y".
yank-pop can be found on "\M-y".

Обозначение \C относится к клавише control. Последовательность \M относится к клавише 'meta' (специальная клавиша на некоторых клавиатурах, или клавиша Alt, или Escape).

Для задания привязки необходимо указать комбинацию клавиш и команду для выполнения, разделив их двоеточием. После комбинации клавиш необходимо ввести двойную кавычку (в некоторых ситуациях приходится использовать еще и одинарную кавычку). Например, для изменения комбинации Control-B для перехода назад на одно слово используйте команду $ bind "\C-b":backward-word.

Привязку можно использовать даже для выполнения команды оболочки (например, для запуска приложения). Для этого необходимо добавить параметр -x, и это как раз случай, когда после комбинации клавиш необходимо использовать оба типа кавычек. Например, для задания комбинации Control-E для запуска emacs, необходимо использовать следующую команду: $ bind -x '"\C-e"':emacs.

Чтобы привязки клавиш были доступны в оболочке bash постоянно, можно задать соответствующие сведения в файле .inputrc (влияет на все приложения с функцией Readline) или можно разместить привязки bash в сценариях запуска, которые будут рассмотрены далее в данной статье.


Журнал команд

Каждая введенная команда записывается, поэтому можно выбрать любую команду и выполнить ее еще раз или отредактировать и выполнить измененную версию команды. Можно просматривать команды в журнале команд (в обратном хронологическом порядке) с помощью комбинации клавиш Control-P (предыдущая команда) и Control-N (следующая команда). К следующей команде можно перейти только в том случае, если ранее выполнен переход к предыдущим командам.

Если известно содержимое команды, но не известно, когда она выполнялась, и не хочется искать команду вручную, можно воспользоваться реверсивным интеллектуальным поиском, нажав комбинацию клавиш Control-R. При этом выполняется переход к первой команде (в обратном порядке), соответствующей первой введенной букве. При дальнейшем вводе букв выполняется поиск соответствующих команд. Обнаружив нужную команду, нажмите Ввод для ее выполнения. Для редактирования найденной команды с помощью клавиш-стрелок (или привязок клавиш) перейдите в то место команды, где требуется сделать изменение.


Настройка командной строки

Все оболочки позволяют настраивать запрос в командной строке с помощью настройки значения переменной PS1. Как правило, возможность настройки ограничена заданием статической строки или (для оболочки Korn) можно задать динамическое значение, например, текущую папку.

Оболочка bash еще больше расширяет данную функцию и позволяет добавлять имя пользователя, имя узла и даже скрытые символы (например, переходы, необходимые для расцвечивания или задания заголовка окон и Xterms). Заданная строка оценивается при каждом выводе запроса, поэтому она всегда является обновленной.

Пользовательские расширения заданных динамических значений достигаются с помощью обратной косой черты и определенной последовательности символов. Например, для задания типового запроса, состоящего из имени пользователя и последней части текущей папки используйте следующую строку: PS1="\u \W$".

Более типовое решение заключается в отображении имени пользователя, имени узла, папки и знака доллара или фунта в зависимости от уникального идентификатора текущего пользователя. Последний параметр служит для отображения знака фунта, если идентификатор пользователя равен нулю (root): PS1='\u@\h:\W \$ ".

Полный список доступных расширений представлен в таблице 1.

Таблица 1. Список доступных расширений
Символ escape-последовательностиОписание
\t\t - время в формате ЧЧ:МM:СС.
\d\d - дата в формате "Название дня, Месяц, День" (например, Fri Oct 13).
\n\n - новая строка.
\s\s - имя оболочки (как правило, bash, или '-bash', если оболочкой регистрации является sell).
\w\w - полный путь к текущей папке.
\W\W - заключительная часть текущей папки (другими словами, 'mc' для пути '/home/mc').
\u\u - имя пользователя.
\h\h - имя узла.
\#\# - номер данной команды (значение увеличивается для каждой строки).
\!\! - уникальный номер журнала для данной команды.
\nnn\nnn is - символ, определяемый восьмеричным значением nnn.
\$\$ - символ #, если действительный идентификатор пользователя равен нулю, в противном случае - символ $.
\\\\ - обратная косая черта.
\[С \[ начинается escape-последовательность; как правило, используется символами управления терминала для расцвечивания и задания заголовков.
\]\] - завершение escape-полследовательности.

Символы escape-полследовательности можно использовать для отправки последовательностей управления терминалов, которые, в свою очередь, можно применять для задания цветов и заголовков терминала. Оболочка bash обновляет данную информацию при каждом отображении запроса, поэтому заголовки окон соответственно обновляются автоматически. Например, последовательность в листинг 2 можно использовать для задания заголовка окна терминала и Xterm как "пользователь@имя узла:полный путь" и задания запроса "имя узла:конечная часть пути" с соответствующим символом завершения (символ доллара или фунта).

Листинг 2. Задание заголовка терминала и запроса
PS1=" \[\033]0;\u@\h: \w\007\]\[\033[31m\]\h \[\033[34m\]\W \$ \[\033[00m\]"

Кроме того, имя узла выделено красным цветом, если оно соответствует пользователю root, зеленым - для обычного пользователя, оставшаяся часть запроса окрашена в голубой цвет.


Завершение файлов и папок

Для ускорения взаимодействия с оболочкой в bash используется завершение имени пути. То есть оболочка bash может заполнить оставшуюся часть имени пути или предоставить список возможных расширений.

Например, если рассматривается текущая папка с диапазоном вложенных папок (см. листинг 3).

Листинг 3. Вложенные папки текущей папке
$ ls -f
back/   cheffyhack/  edin/     logstomerge/  mysql-binlogs/  svn/
build/  cvs/         install/  lost+found/   mysqlsizer      vmware/
calc/   dbdumps/     logs/     my.cnf        statmon/        webs/

Для перехода в папку edin можно ввести команду: $ cd edin. Или с помощью функции завершении оболочки bash можно ввести: $ cd e, а затем нажать клавишу TAB. По умолчанию выполняется попытка найти имя пути, начинающееся с символа 'e'. В результате данная команда будет выглядеть так: $ cd edin.

Если имеется несколько совпадений, то первое нажатие TAB будет неудачным, список соответствующих путей будет выведен после второго нажатия клавиши TAB (см. 4).

Листинг 4. Получение списка соответствующих путей
$ cd my
my.cnf         mysql-binlogs/ mysqlsizer

При развертывании продолжает выполняться отбор уникальных компонентов до тех пор, пока не останется только одно развертывание, или не останется ни одного. Например, рассмотрим последовательность, представленную в листинге 5.

Листинг 5. Продолжение развертывания
$ cd my <TAB>
my.cnf         mysql-binlogs/ mysqlsizer
$ cd mys <TAB>
$ cd mysql <TAB> <TAB>
mysql-binlogs/ mysqlsizer
$ cd mysqls <TAB>
$ cd mysqlsizer

Если имя пути представляет собой папку, то можно продолжить развертывание каждой части имени пути.


Псевдонимы

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

Например, обычным правилом является задание псевдонима ('ll'), который развертывается как 'ls -l', для вывода полного списка папок или списка файлов. Можно создать псевдоним с помощью следующей команды: alias ll='ls -l'.

Для использования просто введите псевдоним после запроса: $ ll.

Поскольку псевдоним является псевдонимом фактической команды, можно добавлять к нему другие параметры, например, для получения списка всех файлов в папке введите команду: $ ll -a, которая разворачивается как: $ ls -l -a.

Псевдонимы предоставляют эффективный способ для быстрого выполнения команд или запуска популярных команд с обычно используемыми параметрами командной строки.


Использование стека папок

Стек папок позволяет хранить одну или несколько папок во временной области, а затем вызывать их обратно. Список папок действует как стек, папка размещается в верхней части стека, а предыдущая папка смещается в нижнюю часть стека.

Для размещения папки в стеке используется команда pushd и имя папки для размещения в стеке. Например, можно разместить в стеке текущую папку, которая может определяться отдельной точкой (см. листинг 6).

Листинг 6. Размещение в стеке текущей папки
$ pushd .
/export/data /export/data

Среда bash реагирует на папку, размещаему в стек, и выводит список всех папок, находящихся в стеке, разделенных пробелом. Данный процесс можно рассмотреть подробней, изменив папку и снова разместив ее в стек (см. листинг 7).

Листинг 7. Размещение в стек другой папки
$ cd /etc
$ pushd .
/etc /etc /export/data

Команда popd смещает папку, добавленную в стек последней, и заменяет ее на заданную папку (см. листинг 8).

Листинг 8. Использование команды popd
$ cd /usr/local/bin
$ popd
/etc /export/data
$ pwd

Команда popd возвращает список папок до изменения на новую папку.

Функция работы с папками наиболее часто используется, когда требуется временно изменить папку, а затем вернуться к исходной папке. Для облегчения такого перехода в среде bash часто настраиваются два псевдонима pu и po (см. листинг 9.

Листинг 9. Псевдонимы pu и po
$ alias pu='pushd .'
$ alias po='popd'

Например, представим, что выполняется работа в одной папке и неожиданно требуется создать архив tar в другой папке (см. листинг 10).

Листинг 10. Использование pu и po для создания архива tar
$ pwd
/usr/local/bin
$ pu
/usr/local/bin /usr/local/bin
$ cd /export/data
$ tar cf webs.tar ./webs
$ po
$ pwd
/usr/local/bin

Хотя система стека папок поддерживает несколько папок, часто она используется только для временного перемещения одной или двух папок.


Файлы конфигурации выполнения bash

После регистрации оболочка bash в дополнение к собственному файлу .bash_profile поддерживает стандартный файл .profile (используемый в оболочке Bourne). Выбор файла выполняется следующим образом:

  • Если имеется файл ~/.bash_profile, то используется этот файл. В противном случае:
  • Если имеется файл ~/.bash_login, то используется этот файл. В противном случае:
  • Если имеется файл ~/.profile, то используется этот файл.

Если оболочка bash не запущена в качестве оболочки входа в систему (например, при использовании Xterm или другого приложения, запускающего подоболочку), bash выполняет поиск файла ~/.bashrc, если он существует.

Посколько содержимое .bashrc и .bash_profile are вряд ли изменяется, нередком можно найти файл .bash_profile, содержащий следующие данные (см. листинг 11).

Листинг 11. Содержимое .bash_profile
if [ -f ~/.bashrc ];
then
    source ~/.bashrc
fi

Помимо этих правил, содержимое файлов полностью определяется пользователем. Посколько в среде bash имеется столько возможностей настройки, нередко содержимое .bashrc/.bash_profile является просто упаковщиком с различными другими сценариями ~/.bash_*. Например, можно разделить файл конфигурации на следующие части:

  • ~/.bash_aliases -- хранение всех пользовательских псевдонимов и функций;
  • ~/.bash_path -- хранение всех спецификаций путей;
  • ~/.bash_vars -- хранение всех переменных bash.

Эти части находятся в файле .bashrc (см. листинг 12).

Листинг 12. Содержимое файла .bashrc
if [ -f ~/.bash_path ]; then
    source ~/.bash_path
fi

if [ -f ~/.bash_vars ]; then
    source ~/.bash_vars
fi

if [ -f ~/.bash_aliases ]; then
    source ~/.bash_aliases
fi

Необходимо проследить за правильностью порядка получаемых файлов.


Улучшение работы со сценариями

Последняя область, в которой bash предоставляет значительное улучшение, - работа со сценариями. Одним из наиболее часто цитируемых ограничений большинства оболочек является то, что в них нельзя произвольно вводить переменные, нет поддержки массивов данных и нет встроенных функций для выполнения базовых математических операций. Все эти проблемы так или иначе решены в среде bash.

Переменные в bash можно объявлять перед их использованием, объявление может включать тип. Например, для объявления переменной типа integer (которая всегда будет определяться как допустимый номер), используйте команду: $ declare -i myint. Для одновременного задания значения: $ declare -i myint=235.

Для выполнения базовых арифметических действий можно встроить выражение в последовательность $(( )) (см. листинг 13).

Листинг 13. Встраивание выражения для выполнения базовых арифметических операций
$ echo $((4+3*12))
40

Можно также включать переменные (см. листинг 14).

Листинг 14. Включение переменных
$ echo $((myint+3*12))
63

Для объявления переменной типа массив, используйте команду $ declare -a myarray.

Можно добавлять значения с помощью задания списка значений, заключенного в скобки: $ declare -a myarray=(tom dick harry).

Для получения значения из массива задайте ссылку массива (см. листинг 15).

Листинг 15. Задание ссылки массива
$ echo ${myarray[1]} 
dick

Для заполнения массива можно использовать такой же способ, например, можно заполнить массив из списка файлов (см. листинг 16).

Листинг 16. Заполнение массива из списка файлов
$ declare -a files=`ls`
$ echo $files
back/ build/ calc/ cheffyhack/ cvs/ dbdumps/ edin/ install/ \
    logs/ logstomerge/ lost+found/ my.
cnf mysql-binlogs/ mysqlsizer statmon/ svn/ vmware/ webs/

Можно использовать все содержимое массива с помощью символа @ в качестве спефицикации элементов (см. листинг 17).

Листинг 17. Использование символа @ в качестве спецификации элементов
for file in ${files[@]}
do
    echo $file
done

Данная операция и поддержка переменных значительно облегчают многие аспекты программирования основных сценариев.


Заключение

Оболочка bash содержит значительные улучшения в сравнении с традиционными оболочками Bourne, Korn и C. Большой набор расширений улучшает интерактивность работы пользователей, использующих среду bash в качестве основного метода взаимодействия с системой. В некоторых системах улучшения становятся привычными, например, завершение имени пути и использование псевдонимов, в других системах они важны только в отдельных случаях. Хорошим примером служит функция стека папок. Она становится ценной, когда требуется быстрый способ перехода в папку, не отвлекаясь от хода мыслей.

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

Ресурсы

Научиться

  • Оригинал статьи System Administration Toolkit: Get the most out of bash;
  • " Making UNIX and Linux work together" (сайт developerWorks, апрель 2006 г.): Данная статья является руководством по совместной работе традиционных дистрибутивов Unix и Linux;
  • Solaris to Linux Migration: A Guide for System Administrators: В различных системах используются разные инструменты, данный Redbook IBM помогает определить ключевые инструменты;
  • " Exploring the Linux memory model" : Описание использования в Linux памяти, подкачки и обмена между ними страниц и процессов;
  • " Working in the bash shell" (developerWorks, май 2006 г.): В данном учебном руководстве содержится руководство по использованию оболочки Bourne Again Shell, включая способы настройки и расширения среды;
  • Bash: Оболочка bash является альтернативой оболочке Bourne с таким же синтаксисом, но расширенным диапазоном функций, включая назначение псевдонимов, управления заданиями и автоматическое завершение имен файлов и папок;
  • AIX® and UNIX articles: Просмотрите другие статьи, написанные Мартином Брауном.
  • Safari: Посетите эту библиотеку ссылок на электронные ресурсы, чтобы найти определенные технические ресурсы;

Получить продукты и технологии

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=199330
ArticleTitle=System Administration Toolkit: Максимальное использование оболочки bash
publish-date=03012007