Zsh. Его конфиги

Первый шаг на этом пути -- задаться вопросом, а зачем zsh'у так много конфигов, если другие шеллы спокойно обходятся двумя (а то и одним, как /bin/sh). На это я отвечу, что конфигов в zsh вовсе не много, а очень много: в дополнение к трем примерным в разделе FILES его man-страницы можно найти упоминание еще о zprofile и zlogout (и, соответственно, ~/.zprofile и ~/.zlogout). А в ходе пользования им вы, скорее всего, увидите в своем каталоге еще и такие файлы, как ~/.zcompdump и ~/.zhistory (или .histfile).

Так для чего нам такое богачество? Чтобы разобраться в этом, вспомним о трех видах функционирования любого шелла -- неинтерактивном, интерактивном и подвиде последнего -- главном пользовательском (login shell). Так вот, файл /etc/zshenv (или ~/.zshenv) считывается при каждом запуске любого экземпляра zsh, независимо от того, происходит он интерактивно или опосредованно. Настройки файла /etc/zshrc~/.zshrc) имеют силу для любого интерактивного запуска zsh. И, наконец, файлы /etc/zlogin и /etc/zprofile оба вместе (как и соответствующая им пара ~/.zlogin и ~/.zprofile) относятся только к тому экземпляру интерактивно запущенного zsh, который выступает в качестве login shell.

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

Хорошо, но зачем же нам два конфига для login shell? -- спросите вы меня. Ответ прост -- из соображений совместимости с bash и tcsh. Для пояснения чего вернёмся к истории вопроса (подробности о конфигах bash и tcsh можно прочитать здесь http://fossbook.info/subproj/shell/1004 и здесь http://fossbook.info/subproj/shell/1020, соответственно).

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

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

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

zshenv -> zprofile -> zshrc -> zlogin

Причем каждый конфиг сначала, естественно, считывается из каталога /etc, а затем из домашнего каталога пользователя берется его аналог. Разумеется, если все четыре файла присутствуют (и там, и там). Что, сразу скажем, отнюдь не обязательно. Очевидно, что совместное использование zprofile и zlogin ни малейшего смысла не имеет. Просто бывшим пользователям bash привычней первая схема запуска login shell, бывшим приверженцам tcsh -- вторая.

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

Осталось объяснить смысл остальных dot-файлов из пользовательского каталога. Каковой, впрочем, ясен из названий: ~/.zlogout -- это сценарий, отрабатываем при выходе из login shell, ~/.zhistory (или .histfile) хранит историю команд (это и есть её буфер), а ~/.zcompdump -- делает то же самое, но для встроенных функций zsh. Два последних файла возникают (при выполнении некоторых условий) сами собой, и речи о них больше почти не будет.

. .