Автор - Лукас Вестерман (Lucas Westermann)

После окончания статей о Screen я подумал, что моим читателям будет интересно узнать, на что ещё способны Bourne-Again Shell (Bash) или Z Shell (Zsh). Я рассмотрю разные обо-лочки для Linux с кратким их описанием, а Zsh и Bash — более подробно, потому что чаще всего я сталкивался именно с ними, и в них мне наиболее ком-фортно работать. У вас, читате-лей, будет достаточно простора для экспериментов с нескольки-ми разными оболочками, чтобы самим ознакомиться с их возможностями.

Вот перечень доступных оболочек:

Bourne Shell (sh) — стандарт-ная оболочка Unix. Не предостав-ляет выдающихся возможнос-тей, кроме основных.

Almquist Shell (ash) — переписан-ная под лицензией BSD Bourne Shell. Возможности, как у предыдущей.

Bourne-Again Shell (bash) — стандартный командный интер-претатор в дистрибутивах Linux. Предлагает расширенный набор возможностей Bourne Shell. Написан как часть проекта GNU.

Debian Almquist Shell (dash) — современный вариант Almquist для Linux-дистрибутивов на базе Debian.

Korn Shell (ksh) — оболочка, написанная Дэвидом Корном (David Korn).

Z Shell (zsh) — считается самой «совершенной» оболочкой из имеющихся (предлагает самый богатый набор возможностей). Можно охарактеризовать как букет возможностей оболочек sh, ash, bash, csh, ksh, and tcsh (оболочка TENEX C).

C Shell (csh) — оболочка, напи-санная Биллом Джоем (Bill Joy). Её главное отличие от других — схожесть синтаксиса с языком программирования Си.

Этот список никоим образом не претендует на полноту, но в нём перечислены оболочки, ко-торые, насколько я знаю, актив-но разрабатываются и исполь-зуются сообществом. Вы може-те подумать, зачем кому-то понадобилось менять стандартную оболочку. Главная причина, по которой оболочке Bash я предпочитаю Z Shell, — это наличие в ней некоторых приятных возможностей (лучшее автодополнение, чем у Bash, более удобный цветной синтаксис для строки запроса, размещение строки запроса как справа, так и слева и т.д.). Богатые возможности приме-нения Linux, в конечном итоге, и определяют выбор. Возможно, вы — опытный программист на Си и предпочитаете оболочку с похожим синтаксисом. В таком случае ваш выбор падёт на C Shell. Я не хочу сказать, что одна оболочка лучше другой только потому, что имеет воз-можности, которых нет у дру-гих, и наоборот. Тем не менее, в этой статье я расскажу, как сконфигурировать оболочки Bourne-Again Shell и Z Shell, потому что у меня есть опыт их использования и потому что они, как мне кажется, самые распространённые.

Первое, что я хочу описать, — это как установить новую оболочку, как её испробовать и как заменить стандартную. Для установки нужной оболочки достаточно воспользоваться средствами apt-get. После уста-новки будет доступна соответ-ствующая man-страница, в которой можно найти сведения о местоположении конфигура-ционного файла. Также, скорее всего, вы захотите увидеть запрос новой оболочки. Этого можно добиться, выполнив соответствующую команду (sh, ash, bash, zsh, csh, ksh и т.д.).*В таком случае вы попадёте в оболочку без замены стандартной. Я обычно рекомендую изучать стандартный файл конфигура-ции, а надстраивать оболочку с помощью локального файла настроек на случай, если что-то пойдёт не так. Также я советую подбирать вид строки запроса в консоли, перед тем как вносить изменения в конфигурационный файл. Это довольно просто: меняйте содержимое перемен-ной «PS1» окружающей среды с помощью командной строки до тех пор, пока результат вас не удовлетворит, и только тогда копируйте конечный результат в файл конфигурации. Когда же вы уверены в том, что с файлом конфигурации всё в порядке, и довольны настройками, то можно приступать к замене стандартной оболочки на новую (если у вас ещё будет такое желание, конечно). Это можно осуществить с помощью команды следующего вида:

sudo chsh -s /path/to/binary $USER

Разумеется, что «/path/to/binary» следует заме-нить на путь к оболочке (например, «/bin/bash»), а «$USER» — на имя действитель-ной учётной записи пользователя, для кото-рого меняется оболочка. В случае, если вы не уверены в наличии нужных (и распознанных систе-мой) оболочек, можете получить их список с помощью такой команды:

chsh -l

Может оказаться, что будут показаны не все доступные обо-лочки, так как команда отобра-жает только перечис-ленные в «/etc/shells», но в основном пакеты обновляют этот список.

Вы можете спросить, что именно можно менять в оболоч-ке и почему стоит это делать. Я расскажу вам о том, как можно экспортировать переменные окружения для использования в оконных менеджерах (openbox вместо Gnome, например), как создавать псевдонимы команд для удобства, как изменить вид строки запроса и как добавлять функции в оболочку. Настройка Z Shell

Чтобы просмотреть содержимое всего файла .zshrc, перейдите по ссылке http://lswest.pastebin.com/WBm22Wig. Примечание по поводу привязок клавиш (bindkeys): в Zsh по умолчанию нет поддерж-ки для клавиш «Home», «End», «Page Up» и «Page Down», и вместо их обработки оболочка отображает их escape-последо-вательности (коды). Вам может понадобиться код определён-ной клавиши. Если использо-вать эмуляцию vi (как я, чего добиваюсь с помощью «bindkeys -v»), то можно получить код клавиши, нажав комбинацию «Ctrl+V», а затем клавишу, код которой вас интересует. Велика вероятность того, что те коды, которые использовал я, будут работать и у вас, но я бы совето-вал вам сначала проверить их у себя.

Я буду ссылаться на файл .zshrc для примеров (указывая номера строк сервиса «pastebin»).

Начну я с экспорта перемен-ных, так как это полезно знать и легко сделать. Для экспорта переменной используйте следующий синтаксис:

export $VARIABLE="value"

Как в моём файле конфигу-рации под номерами 11, 15, 117, 82, 116, 131 и 132. Следует, конечно, заменять «$VARIABLE» на имя перемен-ной (например, «DE» или «OOO_FORCE_DESKTOP»), а «value» на её значение. Кавыч-ки можно опустить, если значе-ние состоит из одного слова (как в моём файле). Последние два экспорта в моей конфигу-рации очень полезны при ис-пользовании Openbox. Первый устанавливает графическое окружение Gnome для «xdg-open» (программа, определя-ющая приложения для файлов по их типу). Другими словами, для «xdg-open» и пути к файлу в среде Gnome будет откры-ваться Nautilus, в Xfce — Thunar, а в KDE — Konqueror. Второй экспорт — переменная «OOO_FORCE_DESKTOP», которая укажет OpenOffice использовать тему GTK вместо QT, которая выставлена по умолчанию в среде, отличной от Gnome.

Следующий полезный трюк — добавление псевдонимов команд в конфигурацию, кото-рые легко позволяют исполь-зовать дополнительные аргу-менты для команды. Это отчёт-ливо видно в строке 84, где я определил псевдоним «trayer» (скрыв таким образом вызов оригинальной команды) для запуска команды «trayer» с предопределёнными парамет-рами. В случае необходимости вызова оригинальной команды (без использования псевдонима) используйте следующий синтаксис:

\<имя_псевдонима>

В моём случае команда будет выглядеть как «\trayer». Это похоже на то, как обычно в оболочке указывается опреде-лённый символ, который должен трактоваться исключительно как текст. Особенно полезен для меня псевдоним «ls» (строка 64), который я исполь-зую на всех своих *nix-компью-терах. Он предоставляет более информативный вывод содержи-мого каталога.

И вот мы подошли к наибо-лее интересному аспекту в настройке оболочки — настрой-ке строки запроса. Вот как выг-лядит предпочитаемая мной строка запроса:

┌─[lswest@laptop:~] - [14:24:29]
└─>

Этот запрос состоит из двух строк. Она даёт мне больше пространства для ввода команд. В ней отображены: пользователь, имя компьютера и рабочая директория (после двоеточия). Если вам интерес-но, как я изловчился сделать две строки, то спешу сообщить, что вся магия происходит в том месте, где встречается ««$'\n'«». Там я вписал escape-последова-тельность для перехода на новую строку, после которой продолжил запрос. Она не сра-батывает (по крайней мере в последний раз, когда я пробовал), если просто заключить её в двойные кавычки. Для распо-ложения строки запроса справа нужно использовать перемен-ную «RPROMPT» (я закомменти-ровал её в своей конфигурации, но она всё еще там).

Я регулярно обновляю конфи-гурацию, и та её копия, что в данный момент на сервисе «pastebin», уже отстала на пару изменений. Но главное новшест-во в том, что сейчас моя строка запроса отображает ещё и время. Если посмотреть на конфигура-цию, то можно увидеть два определения строки запроса в if-блоке. В нём происходит провер-ка, использую ли я программу Screen, и если это так — строка запроса отображает ещё и теку-щий номер окна Screen перед именем пользователя. Это позволяет мне легко ориентиро-ваться где я нахожусь. Полный список escape-последователь-ностей для Zsh доступен в man-странице zshmisc. А вот список тех, которые я часто использую (взято с http://www.acm.uiuc.edu/ workshops/zsh/prompt/escapes.html):

Литеральные константы

%% — символ «%» %) — символ «)»

Каталоги

%d — рабочий каталог ($PWD)

%~ — $PWD, но делает две подстановки. Если именуемая директория «X» — префикс рабочей директории, то получим «~X». Если рабочий каталог является домашним каталогом ($HOME), то получим «~».

%c — конечный компонент переменной $PWD. Можно указать число, следующее за «%», для указания желаемого количества компонентов.

%C — то же, что «%c» и «%.», с той лишь разницей, что символ «~» никогда не отображается в имени каталога.

Информация о хосте (имя компьютера)

%M — полное имя компьютера.

%m — имя компьютера до первой точки («.»). После «%» можно указать желаемое число компонентов имени компьютера.

Информация о текущем времени

%t — текущее время в 12-часовом, «am/pm» формате.

%T — текущее время в 24-часовом формате.

%* — текущее время в 24-часовом формате с секундами.

Информация о текущей дате

%w — дата в формате «день-дд».

%W — дата в формате «мм/дд/гг».

%D — дата в формате «гг-мм-дд».

%D{строка} — значение «строка» формируется с помощью функ-ции strftime. Доступны допол-нительные коды: «%f» выводит день месяца, как «%e», но без предшествующих символов дополнения, когда день состоит из одной цифры; «%K»/«%L» соответствует «%k»/«%l», используется для отображения времени (форматы 24/12).

Дополнительная информация

%h — текущий номер команды в истории.

%n — эквивалент $USERNAME.

%l — номер терминала (tty), в котором находится пользователь.

%# — «#», если оболочка запу-щена с привилегиями, в против-ном случае — «%». Привилеги-рованность в данном случае определяется по эффективному ID пользователя равному нулю, или, если поддерживаются возможности POSIX.1e, когда установлен один из векторов полномочий: Effective или Inheritable.

Zsh даёт возможность зада-вать некоторые стандартные цвета с помощью их названий (red, cyan и т.д.). Но можно задавать и в стиле «\e[0;31m» (как описано в разделе про Bash).

Последняя и, скорее всего, наиболее полезная возмож-ность — добавление функций. Это делается так же, как и в скриптах Bash, где синтаксис определения функции таков: «имя_функции() { #код}». В моём файле .zshrc есть несколь-ко функций: m4a, flvmp3, google и другие. Как видите, можно определять функции без дескрип-тора «function», но с ним код более читабелен. Мой конфигу-рационный файл никоим обра-зом не является примером хоро-шего оформления. В идеале я должен был оформить все экс-порты, функции, псевдонимы и прочее отдельными блоками. А вместо этого я вношу измене-ния в том порядке, в котором они приходят в голову, и в результате получается беспо-рядок. Возможно, я как-нибудь соберусь и наведу в нём порядок (что случается примерно раз в году).

Настройка Bourne-Again Shell

Экспортирование и создание псевдонимов в Bash делаются точно так же, как и в Zsh. Сле-довательно, чтобы узнать как это делать, вам следует обра-тится к первым двум описани-ям в разделе «Настройка Z Shell». Единственные несоответствия с Bash в файле .zshrc, на который я ссылаюсь, там, где идёт речь о привязках клавиш (bindkeys) и о «PROMPT». Настройка строки запроса в Bash похожа на таковую в Zsh, за исключением списка escape-последовательностей, которые можно применять в Bash, и того, как ведёт себя переменная в случае разбиения запроса на две строки. Ниже приведён список escape-последовательностей для Bash (взято с http://www.cyberciti.biz/ tips/howto-linux-unix-bash-shell-setup-prompt.html):

\a — символ звукового сигнала ASCII (07).

\d — дата в формате «День_недели Месяц Дата» (например, «Суб Май 1»).

\D{формат} — «формат» пере-даётся в функцию strftime и результат подставляется в строку запроса. Пустой формат сгенерирует данные исходя из настроек локализации системы. Фигурные скобки обязательны.

\e — символ «escape» ASCII (033).

\h — имя компьютера до первой точки («.»).

\H — имя компьютера.

\j — количество выполняемых оболочкой заданий.

\l — базовое имя терминала оболочки.

\n — новая строка.

\r — возврат каретки.

\s — имя оболочки, базовое имя из «$0» (та его часть, следую-щая за последним символом «/»).

\t — текущее время в 24-часовом «ЧЧ:ММ:СС» формате.

\T — текущее время в 12-часовом «ЧЧ:ММ:СС» формате.

\@ — текущее время в 12-часовом «am/pm» формате.

\A — текущее время в 24-часовом «ЧЧ:ММ» формате.

\u — имя пользователя.

\v — версия Bash (например, 2.00).

\V — релиз Bash , версия + patch level (например, 2.00.0).

\w — текущий каталог, с заменой $HOME на тильду («~»).

\W — полный путь текущего каталога, с заменой $HOME на тильду.

\! — номер истории для этой команды.

\# — номер команды для этой команды. \$ — если эффективный UID равен «0», то подставляется «#», иначе — «$».

\nnn — соответствующий символ по десятичному числу «nnn».

\\ — обратный слэш («\»).

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

\] — конец последовательности непечатаемых символов.

Для создания в Bash строки запроса в несколько рядов, достаточно вставлять escape-последовательность перехода на новую строку («\n») там, где вы хотите оборвать её. Вы также можете изменять «PS2» и последующие, которые будут проявляться, если начать много-строчную команду (например, «A» для цикла). Для управления цветом есть соответствующие escape-последовательности (http://wiki.archlinux.org/index.php/Color_Bash_Prompt#List_of_colors_for_prompt_and_Bash).

Можно создать переменные со значениями цветов и исполь-зовать их в конфигурационном файле. Вот как выглядит в Bash моя строка запроса из Zsh (без отображения времени):

export PS1="\[\e[0;37m\]┌─
[\[\e[0;32m\]
\u\[\e[0;36m\]@\[\e[0;32m\]
\h\[\e[0;37m\]:\[\e[0;33m\]
\w\[\e[0;37m\]]\[\e[0;36m\]
\n\[\e[0;37m\]└─>\[\e[0m\] "

Приношу извинения за то, что у меня нет примера файла конфигурации для Bash. Но тот, что уже есть, подходит для обе-их оболочек, так как синтаксис конфигурации одинаков для Bash и Zsh. Если кто-либо из читателей пожелает, то я с радостью покажу его надстро-енный .bashrc-файл наряду с текстовым представлением строки запроса в начале каж-дой статьи в разделе «Покоряй и властвуй». Если вы заинтере-совались, то присылайте мне по почте свой .bashrc-файл и текс-товое представление строки запроса или её скриншот на lswest34@gmail.com. Также ука-жите в теме письма «Command & Conquer», тогда я подниму его выше в своём списке прио-ритетов. Те, кто использует urxvt/define цвета в .Xdefaults присылайте также соответству-ющие разделы (если высылаете скриншот).

Любые вопросы, предложе-ния или проблемы можно присы-лать мне на lswest34@gmail.com. Дальнейшие идеи для статей также всегда приветствуются! Желаю вам приятного времяпре-провождения за настройкой своей строки запроса! Мне любопытно будет посмотреть на ваши результаты! Надеюсь, у меня неплохо получилось объяснить, как это делается. И я с удовольствием продолжу дальнейшие надстройки терми-нала, если к этому проявится должный интерес. И, как всег-да, дополнительные источники информации я представляю в разделе «Читайте дальше».

Читайте дальше:

Информация по псевдонимам для команд - http://en.wikipedia.org/wiki/Alias_%28command%29

How-to по нас-тройке строки запроса в Bash - http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html

Многострочные строки запроса - http://markelikalderon.com/2007/11/24/full-paths-and-the-multiline-shell-prompt/

Раскраска строки запроса в Bash - http://wiki.archlinux.org/index.php/Color_Bash_Prompt#List_of_colors_for_prompt_and_Bash

Настройка строки запроса в Zsh - http://docs.cs.byu.edu/linux/advanced/zsh.html