Воззрения кота Manual’а. CLI и Zsh. О конфигах Zsh вообще

Алексей Федорчук

manul-logo-100

В разделе о мифологии относительно Zsh предыдущей части упоминалось про изобилие конфигурационных файлов этого шелла. И говорилось, что большая их часть совсем не обязательна для использования и, тем более, редактирования.

Однако кот Мануал решил вкратце остановиться на этом вопросе — во-первых, полноты картины для. А во-вторых и главных — дабы потенциальный применитель Zsh, прочитав в сети (или в документации) о конфигурационных файлах этой оболочки, не устрашился бы их изобилия. А сразу понял бы, что из него ему требуется, а что — можно (и нужно) просто проигнорировать.

Конфиги Zsh

В Zsh предусмотрен следующий набор общесистемных конфигурационных файлов, находящихся каталоге /etc/zsh:

  • zshenv — считывается при запуске любого экземпляра Zsh;
  • zprofile — используется только при запуске Zsh как регистрационной оболочки входа (login shell);
  • zshrc — обрабатывается при запуске любого интерактивного экземпляра Zsh;
  • zlogin — используется только при запуске как login shell.

Это — в теории. Практически набор общесистемных конфигов зависит от конкретной сборки пакета zsh, и различается в разных системах. Например, в Antergos’е имеется только один общесистемный конфиг Zsh — /etc/zsh/zprofile. А в сборках этой оболочки для Ubuntu’идов, напротив, имеется ещё /etc/zsh/newuser.zshrc.recommended, к которому мы вернёмся позднее.

Опять же теоретически общесистемные конфиги Zsh могут дополняться своими пользовательскими тёзками — файлами ~/.zshenv, ~/zprofile., ~/.zshrc и ~/.zlogin. Практически, как будет сказано далее, для полноценной работы достаточно одного из них — ~/.zshrc: только он и создаётся при автоматическом конфигурировании оболочки. Созданием прочих конфигов применитель — должен озаботиться сам. Если это ему на самом деле это необходимо, в чём я лично сильно сомневаюсь — за исключением некоторых специальных случаев.

Содержимое и назначение конфигов

Как уже сказано, все системные конфиги Zsh из каталога /etc/zsh имеют (точнее, могут иметь) свои аналоги в домашнем каталоге пользователя. И назначение их следующее:

  • zshenv и его «домашний тёзка» содержат только определения путей (переменная $PATH) и некоторые другие переменные окружения; в нём не должно быть команд, выводящих что-либо, и привязки к терминалам;
  • zprofile в «апстримовском» варианте (и в Ubuntu’идных сборках) по умолчанию просто пуст; в Antergos’е он явным образом вызывает системный /etc/profile, общий для всех POSIX-совместимых оболочек;
  • zshrc и его «домашний дубель» содержат все настройки шелла, важные для альтернативной работы; первый по умолчанию пуст, а о содержимом второго будет сказано позднее;
  • zlogin и ~/.zlogin служат для определения таких вещей, как тип терминала, а также для запуска команд, выполнение которых необходимо сразу после входа в систему (если таковые имеются).

При запуске Zsh как регистрационной оболочки конфиги считываются в определённом порядке, при котором настройки из домашнего каталога имеют приоритет над общесистемными:

zshenv -> ~/.zshenv
zprofile -> ~/.zprofile
zshrc -> ~/.zshrc
zlogin -> ~/.zlogin

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

Кроме файлов, считываемых при запуске шелла, имеется и конфиг, обрабатываемый при выходе из интерактивного пользовательского сеанса по команде logout (или exit). Это — системный zlogout (по умолчанию пустой), который может иметь (или не иметь) «домашний» аналог, ~/.zlogout.

В домашнем каталоге пользователя, кроме «дублей» присутствует два «уникальных» dot-файла и вот их-то наличие непременно: ~/.zhistory (или .histfile) хранит историю команд, а ~/.zcompdump — предствляет собой своего рода кеш автодополнений. Два последних файла возникают сами собой, и немало способствуют эффективности использования Zsh.

Зачем из столько?

Настало время задаться вопросом: а зачем Zsh так много файлов настройки? Ведь обычные стиральные порошки шеллы спокойно обходятся двумя (а то и одним /etc/profile, как легендарный /bin/sh). Тем более, что «сладкие парочки» zprofile и zlogin по назначению явно дублируют друг друга.

Для ответа на поставленный вопрос нужно вспомнить о трёх режимах функционирования любого шелла — неинтерактивном, интерактивном и подвиде последнего — регистрационном (то естьlogin shell). А как было сказано выше, файлы zshenv и ~/.zshenv считываются при каждом запуске любого экземпляра Zsh, в том числе и исполняемого в скриптах. А настройки из файлов zshrc и ~/.zshrc имеют силу для любого интерактивного запуска (например, в иксовом терминале).

Наконец, файлы zlogin и zprofile, вместе с сопутствующими им ~/.zlogin и ~/.zprofile) обеспечивают настройку только того экземпляра Zsh, который был запущен после регистрации пользователя в системе. То есть, вроде бы, не охватывают те, сеансы шелла, которые запускаются в терминальных окнах. Впрочем, с важной оговоркой: нынче большинство «продвинутых» терминальных программ имеют в своих настройках опцию Запускать как login shell.

Всё это теоретически позволяет гибко (и индивидуально) настроить экземпляры Zsh, запускаемые из сценариев, обычные интерактивные сеансы и сеанс регистрационный. Правда, а зачем нам два генеральных секретаря конфига для login shell? — спросите вы меня. Ответ прост — из соображений совместимости с Bash и Tcsh. Для пояснения чего обратимся к истории командных оболочек.

В первозданном шелле Борна и развивающем его шелле Корна существовал только один конфиг — profile (~/.profile) для любых экземпляров шелла. В Bash к нему прибавился ещё и файл bashrc (~/.bashrc) для интерактивного использования (считываемые, естественно, после предыдущего — как более молодые по происхождению).

В Csh был совсем иной набор. Там изначально существовали два конфига — csh.env (~/.csh.env) на все случаи жизни и /etc/login (~/.login) — в качестве конфигуратора login shell, считываемые в указанном порядке.

В Zsh, дабы удовлетворить привычки пользователей любых предшествовавших шеллов, были включены оба набора конфигов, причём порядок их считывания был унаследован от каждого из родителей. В результате получилась довольно сложная последовательность при запуске login shell, описанная выше.

На практике нынче всё описанное выше богачество конфигов оказывается невостребованным. И пользователь вполне может обойтись только одним ~/.zshrc в своём домашнем каталоге — ведь login shell по определению интерактивен. Общие же переменные окружения (такие, как $PATH) будут извлекаться из общесистемного конфига /etc/profile, который считывается всеми POSIX-совместимыми шеллами. Именно так мы и поступим.

Что настраивать

Разобравшись с назначением dot-файлов, можно заняться отделением зёрен от плевел, то есть решим: а какие же именно файлы нужно настроить.

Для начала мы оставим бы в покое все файлы из каталога /etc, которые вполне могут быть перезаписаны при обновлении системы. Так что ограничимся только нашим домашним каталогом. Однако здесь кое-что зависит от дистрибутива.

Так, в Ubuntu’идах (и, видимо, вообще во всех deb-based системах) по умолчанию не работает такая полезная фича, как history-substring-search — поиск в истории по начальной последовательности символов. И один из способов устранения этого недостатка — использование специальной опции в файле ~/.zshenv, который нам и потребуется и в Cintu, и в Neon’е. Однако в более иных дистрибутивах, в частности, в Antergos’е, ни малейшей необходимости в нём нет.

Далее, решаем, а нужен ли нам отдельный конфиг для login shell, и если нужен — то какой из них, ~/.zlogin или ~/.zprofile. И приходим к выводу, что вполне можно обойтись и без того, и без другого, поскольку применяться Zsh будет в основном в терминальных окнах. По той же причине представляется лишним и ~/.zlogout.

И в итоге остаётся главный (по крайней мере, самый большой) конфиг Zsh — ~/.zshrc, определяющий поведение этой оболочки в интерактивном режиме. Что с ним делать? Тут, как говорится, возможны варианты.

Способы настройки своего zshrc

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

Как можно видеть на скриншоте, он предлагает три направления дальнейших действий:

  1. прерывание конфигурирования — в этом случае предложение заняться им поступит при следующем запуске шелла (например, при открытии терминального окна или вкладки в нём);
  2. завершение конфигурирования с созданием пустого ~/.zshrc, что предотвратит запуск конфигуратора при открытии следующего сеанса;
  3. продолжение процесса конфигурирования.

Третий вариант кот Манул предполагает рассмотреть как-нибудь позднее, опять же полноты картины ради. Пока же заметим только, что он отнюдь не рассчитан на начинающих применителей Zsh — результата, оправдывающего затраченное на него время, можно достигнуть, только понимая смысл совершаемых действий — а для этого понимания требуется некоторый опыт.

Можно, конечно, просто соглашаться со всеми предлагаемыми конфигуратором умолчаниями — и в результате получить если и не идеальный ~/.zshrc, то весьма разумный и функциональный. Однако тот же результат достигается проще, о чём будет сказано далее.

Второй путь, приводящий к созданию ~/.zshrc с единственной строкой комментария, молчаливо предполагает, что остальное его содержание будет вноситься руками, в текстовом редакторе, из головы (или из документации). Что, понятно, не самое простое дело, и не только для начинающего, но и для многоопытного применителя.

И поэтому мы с котом идём другим путём, первым: прерываем процесс конфигурирования, и копируем в свой домашний каталог свой ~/.zshrc. Ну у нас-то с Мануалом таковой имеется вот уже более пятнадцати лет. А что делать применителям, кто запускает Zsh первый раз в жизни? Тут на их пути возникает развилка из трёх, опять-таки, дорог.

В начале этого очерка упоминался файл /etc/zsh/newuser.zshrc.recommended. Как нетрудно догадаться по его имени, это и есть конфиг Zsh, рекомендуемый для нового пользователя. И выбор первого ответвления нашего пути — просто скопировать его в свой домашний каталог:

$ cp /etc/zsh/newuser.zshrc.recommended ~/.zshrc

Результат будет примерно тот же, что и при прохождении всех стадий автоматического конфигурирования, соглашаясь со всеми умолчаниями. То есть: разумный, но не идеальный. Однако это путь самый быстрый и простой — а поисками идеала заняться на досуге.

Тем не менее, устремление к идеалу можно и не откладывать в долгий ящик. А поискать его среди конфигов, в изобилии представленных как в дополнительных пакетах вроде zsh-lovers, так и на многочисленных тематических ресурсах, из которых наибольшей известностью пользуется Oh My ZSH!. Однако интересных материалов и в первом, и во втором случае так много, что в нём легко утонуть с головой. И забыть, зачем всё это начиналось.

И потому мы с Мануалом предлагает пойти по третьему ответвлению первого пути, а именно: скачать и скопировать наш ~/.zshrc. Мы, конечно, не настолько самоуверенны, чтобы считать свой конфиг Zsh лучшим конфигом всех времён и народов. Однако он обеспечивает весь функционал, описанный в Части 2.

Самое же главное — наш ~/.zshrc, безусловно, лучше всего описан на русском языке в Части 3 данного сочинения. А скачать его и прочитать, что делать со скачанным, можно здесь. Кстати, и сам конфиг внутри содержит достаточно подробные комментарии, и тоже на языке родных осин.

[Общее содержание]

Добавить комментарий