Различия
Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
fullcircle:35:советы_ч_11 [2010/06/25 20:09] создано |
fullcircle:35:советы_ч_11 [2010/07/13 21:56] (текущий) |
||
---|---|---|---|
Строка 17: | Строка 17: | ||
- [[..:35:советы_ч_11|Советы по работе в терминале - Часть 11]] | - [[..:35:советы_ч_11|Советы по работе в терминале - Часть 11]] | ||
- [[..:36:советы_ч_12|Советы по работе в терминале - Часть 12]] | - [[..:36:советы_ч_12|Советы по работе в терминале - Часть 12]] | ||
+ | |||
+ | После окончания статей о 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» окружающей среды с помощью командной строки до тех пор, пока результат вас не удовлетворит, и только тогда копируйте конечный результат в файл конфигурации. Когда же вы уверены в том, что с файлом конфигурации всё в порядке, и довольны настройками, то можно приступать к замене стандартной оболочки на новую (если у вас ещё будет такое желание, конечно). Это можно осуществить с помощью команды следующего вида: | ||
+ | |||
+ | <code>sudo chsh -s /path/to/binary $USER</code> | ||
+ | |||
+ | Разумеется, что «/path/to/binary» следует заме-нить на путь к оболочке (например, «/bin/bash»), а «$USER» — на имя действитель-ной учётной записи пользователя, для кото-рого меняется оболочка. В случае, если вы не уверены в наличии нужных (и распознанных систе-мой) оболочек, можете получить их список с помощью такой команды: | ||
+ | |||
+ | <code>chsh -l</code> | ||
+ | |||
+ | Может оказаться, что будут показаны не все доступные обо-лочки, так как команда отобра-жает только перечис-ленные в «/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»). | ||
+ | |||
+ | Начну я с экспорта перемен-ных, так как это полезно знать и легко сделать. Для экспорта переменной используйте следующий синтаксис: | ||
+ | |||
+ | <code>export $VARIABLE="value"</code> | ||
+ | |||
+ | Как в моём файле конфигу-рации под номерами 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» с предопределёнными парамет-рами. В случае необходимости вызова оригинальной команды (без использования псевдонима) используйте следующий синтаксис: | ||
+ | |||
+ | <code>\<имя_псевдонима></code> | ||
+ | |||
+ | В моём случае команда будет выглядеть как «\trayer». Это похоже на то, как обычно в оболочке указывается опреде-лённый символ, который должен трактоваться исключительно как текст. Особенно полезен для меня псевдоним «ls» (строка 64), который я исполь-зую на всех своих *nix-компью-терах. Он предоставляет более информативный вывод содержи-мого каталога. | ||
+ | |||
+ | И вот мы подошли к наибо-лее интересному аспекту в настройке оболочки — настрой-ке строки запроса. Вот как выг-лядит предпочитаемая мной строка запроса: | ||
+ | |||
+ | <code> | ||
+ | ┌─[lswest@laptop:~] - [14:24:29] | ||
+ | └─> | ||
+ | </code> | ||
+ | |||
+ | Этот запрос состоит из двух строк. Она даёт мне больше пространства для ввода команд. В ней отображены: пользователь, имя компьютера и рабочая директория (после двоеточия). Если вам интерес-но, как я изловчился сделать две строки, то спешу сообщить, что вся магия происходит в том месте, где встречается «"$'\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 (без отображения времени): | ||
+ | |||
+ | <code>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\] "</code> | ||
+ | |||
+ | Приношу извинения за то, что у меня нет примера файла конфигурации для 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 | ||
--------------------------------------- | --------------------------------------- |