Привет. Не будем нарушать воскресных традиций. Утреннее чтиво.



Давай покумекаем, чем отличаются файлы .bashrc .bash_profile .profile и т.п.



Вообще про это особо никто не задумывается, если что-то требуется сделать, обычно запихивают всё в .bashrc. Но почему именно туда? А нахрена тогда нужен .profile?



Основное различие этих конфигурационных файлов заключается в том, что некоторые из них читаются только оболочками входа (login). Например, при входе в систему с другого хоста или при входе в текстовую консоль локальной unix-машины. Используются файлы .login .profile .zlogin. Зависит от того какая у тебя оболочка.



Далее идут конфигурационные файлы, которые читаются «интерактивными» оболочками. То есть подключенными к терминалу или псевдотерминалу. Это файлы с именами .bashrc, .tcshrc, .zshrc и т.д.



Файл .bashrc читается только интерактивной и non-login оболочкой, поэтому большинство людей в конечном итоге инклудят в файле .bash_profile чтение файла .bashrc, например:



[[ -r ~/.bashrc ]] && . ~/.bashrc



Другие оболочки ведут себя по-другому. Например, в zsh, файл .zshrc всегда читается для интерактивной оболочки, независимо от того, является ли она login или нет.



А файл .profile, это просто сценарий входа в систему. И изначально использовался в /bin/sh. Оболочка Bash, будучи обратно совместимым с sh, будет читать .profile, если он конечно же существует.



Пример файла .profile



if [ "$BASH" ]; then

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

fi



Как видим, при login’е заинклудится файл .bashrc.



Классически ~/.profile используется в Bourne Shell. И вероятно, поддерживается Bash как устаревшая мера. Опять же ~/.login и ~/.cshrc использовались оболочкой CShell (csh).



В дистрибутивах семейства Debian сначала выполняется .profile, а потом уже .bash_profile. А вот в дистрибах производных от RHEL, сначала выполняется .bash_profile, а уже потом .profile. Ну вот прям каша! 



Короче как обычно развели зоопарк, одно читает другое, чтобы заработало третье. Масло-масляное. А есть же еще всякие .environment, у которого ноги растут из Korn Shell (ksh).



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



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



Выжимка из man bash:



/bin/bash - The bash executable

/etc/profile - The systemwide initialization file, executed for login shells

/etc/bash.bashrc - The systemwide per-interactive-shell startup file

/etc/bash.bash.logout - The systemwide login shell cleanup file, executed when a login shell exits

~/.bash_profile - The personal initialization file, executed for login shells

~/.bashrc - The individual per-interactive-shell startup file

~/.bash_logout - The individual login shell cleanup file, executed when a login shell exits

~/.inputrc - Individual readline initialization file



Если есть чего добавить, велком в комментарии. Ладно, вечерком затроним какую-нибудь техническую часть, а может быть и подебажим. На связи!



tags: #linux #bash



💩 @bashdays