Підкоряй і володарюй Поради по роботі в терміналі
Зміст
Автор - Лукас Вестерман (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 та 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» навколишнього середовища за допомогою командного рядка до тих пір, поки результат вас не задовольнить, і тільки тоді копіюйте кінцевий результат у файл конфігурації. Коли ж ви впевнені в тому, що з файлом конфігурації все гаразд і задоволені налаштуваннями, то можна приступати до заміни стандартної оболонки на нову (якщо у вас ще буде таке бажання, звичайно). Це можна зробити за допомогою команди наступного виду:
Зрозуміло, що "/path/to/binary" слід замінити на шлях до оболонки (наприклад, "/bin/bash"), а "$ USER" - на ім'я дійсного облікового запису користувача, для якого змінюється оболонка. У випадку, якщо ви не впевнені в наявності потрібних (і розпізнаних системою) оболонок, можете отримати їх список за допомогою такої команди:
Може виявитися, що будуть показані не всі доступні оболонки, так як команда відображає тільки перераховані в /etc/shells, але в основному пакети оновлюють цей список.
Ви можете запитати, що саме можна змінювати в оболонці і чому варто це робити. Я розповім вам про те, як можна експортувати змінні оточення для використання у віконних менеджерах (openbox замість Gnome, наприклад), як створювати псевдоніми команд для зручності, як змінити вигляд рядка запиту та як додавати функції до оболонки. Налаштування Z Shell
Я посилатимуся на файл .zshrc для прикладів (вказуючи номери рядків сервісу pastebin).
Почну я з експорту змінних, тому що це корисно знати і легко зробити. Для експорту змінної використовуйте наступний синтаксис:
Як у моєму файлі конфігурації під номерами 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-комп'ютерах. Він надає більш інформативний висновок вмісту каталогу.
І ось ми підійшли до найбільш цікавого аспекту в налаштуванні оболонки - налаштуванні рядка запиту. Ось як виглядає бажаний мною рядок запиту:
Я регулярно оновлюю конфігурацію, і та її копія, що в даний момент на сервісі 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 - новий рядок.
- повернення каретки.
\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".
\\ - зворотний слеш ("\").
\[ — починає послідовність недрукованих символів, які можна використовувати для впровадження в термінал управляючих послідовностей у рядок запиту.
\] — кінець послідовності символів, що не друкуються.
Для створення в рядку рядків запиту в декілька рядів, достатньо вставляти escape-послідовність переходу на новий рядок («\n») там, де ви хочете обірвати його. Ви також можете змінювати «PS2» та наступні, які будуть проявлятися, якщо почати багаторядкову команду (наприклад, «A» для циклу). Для керування кольором є відповідні escape-послідовності (http://wiki.archlinux.org/index.php/Color_Bash_Prompt#List_of_colors_for_prompt_and_Bash).
Можна створити змінні зі значеннями кольорів і використовувати їх у конфігураційному файлі. Ось як виглядає в Bash мій рядок запиту з Zsh (без відображення часу):