Покоряй и Властвуй: Советы по работе в терминале. Часть 11 Сравнение версий

Различия

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

Ссылка на это сравнение

Следующая версия
Предыдущая версия
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
  
 --------------------------------------- ---------------------------------------