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://nafanyaclub.ru/subproj/shell/1004 и здесь http://nafanyaclub.ru/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
. Два последних файла возникают (при выполнении некоторых условий) сами собой, и речи о них больше почти не будет.