Я использовал несколько различных систем на основе * nix за эти годы, и кажется, что каждый вариант Bash, который я использую, имеет свой алгоритм для принятия решения о том, какие сценарии запуска запускать. Какой сценарий запуска является подходящим местом для таких задач, как настройка переменных и псевдонимов среды и печать сообщений запуска (например, MOTD)?
В чем разница между помещением вещей в .bashrc, .bash_profile и .environment? Я также видел другие файлы, такие как .login, .bash_login и .profile; это когда-нибудь актуально? В чем разница, какие из них запускаются при физическом входе в систему, удаленном входе через ssh и открытии нового окна терминала? Есть ли какие-либо существенные различия между платформами (включая Mac OS X (и ее Terminal.app) и Cygwin Bash)?





Я нашел информацию о .bashrc и .bash_profile здесь, чтобы подвести итог:
.bash_profile is executed when you login. Stuff you put in there might be your PATH and other important environment variables.
.bashrc is used for non login shells. I'm not sure what that means. I know that RedHat executes it everytime you start another shell (su to this user or simply calling bash again) You might want to put aliases in there but again I am not sure what that means. I simply ignore it myself.
.profile is the equivalent of .bash_profile for the root. I think the name is changed to let other shells (csh, sh, tcsh) use it as well. (you don't need one as a user)
There is also .bash_logout wich executes at, yeah good guess...logout. You might want to stop deamons or even make a little housekeeping . You can also add "clear" there if you want to clear the screen when you log out.
Также есть полное отслеживание каждого из файлов конфигурации здесь
Они, вероятно, даже зависят от дистрибутива, не все дистрибутивы хотят иметь с ними каждую конфигурацию, а некоторые имеют даже больше. Но когда у них одно и то же имя, они обычно включают одно и то же содержание.
Хорошее место для просмотра - справочная страница bash. Здесь - онлайн-версия. Ищите раздел «ПРИЗЫВ».
Классически ~/.profile используется Bourne Shell и, вероятно, поддерживается Bash в качестве устаревшей меры. Опять же, ~/.login и ~/.cshrc использовались C Shell - я не уверен, что Bash их вообще использует.
~/.bash_profile будет использоваться один раз при входе в систему. Сценарий ~/.bashrc читается каждый раз при запуске оболочки. Это аналог /.cshrc для C Shell.
Одним из следствий этого является то, что содержимое ~/.bashrc должно быть как можно более легким (минимальным), чтобы уменьшить накладные расходы при запуске оболочки без входа в систему.
Я считаю, что файл ~/.environment является файлом совместимости для Korn Shell.
Основное различие с конфигурационными файлами оболочки состоит в том, что некоторые из них читаются только оболочками "входа в систему" (например, когда вы входите в систему с другого хоста или входите в текстовую консоль локальной машины unix). это те, которые называются, скажем, .login, .profile или .zlogin (в зависимости от того, какую оболочку вы используете).
Затем у вас есть файлы конфигурации, которые читаются "интерактивными" оболочками (например, те, которые подключены к терминалу (или псевдотерминалу в случае, скажем, эмулятора терминала, работающего под управлением оконной системы). Это те, которые имеют имена например .bashrc, .tcshrc, .zshrc и т. д.
bash усложняет это тем, что .bashrc - это только читается оболочкой, которая одновременно является интерактивный и не входить в систему, поэтому вы обнаружите, что большинство людей в конечном итоге говорят своему .bash_profile также читать .bashrc с чем-то вроде
[[ -r ~/.bashrc ]] && . ~/.bashrc
Другие оболочки ведут себя иначе - например, с zsh, .zshrc всегда читается для интерактивной оболочки, независимо от того, является ли она входящей в систему или нет.
На странице руководства для bash объясняются обстоятельства, при которых читается каждый файл. Да, поведение машин в целом одинаково.
.profile - это просто имя файла сценария входа, которое изначально использовалось /bin/sh. bash, будучи обычно обратно совместимым с /bin/sh, будет читать .profile, если он существует.
Все просто. Это объясняется в man bash:
/bin/bash
The bash executable
/etc/profile
The systemwide initialization file, executed for login shells
~/.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
Оболочки входа - это те оболочки, которые читаются при входе в систему (поэтому они не выполняются, например, при простом запуске xterm). Есть и другие способы авторизации. Например, с помощью диспетчера отображения X. У них есть другие способы чтения и экспорта переменных среды во время входа в систему.
Также прочтите главу INVOCATION в руководстве. Там написано «Следующие параграфы описывают, как bash выполняет свои файлы запуска»., я думаю, это точно :) В нем также объясняется, что такое "интерактивная" оболочка.
Баш ничего не знает о .environment. Я подозреваю, что это файл из вашего дистрибутива, чтобы установить переменные среды независимо от оболочки, которую вы используете.
Согласно Джош Стайгер, Terminal.app Mac OS X фактически запускает оболочку входа в систему, а не оболочку без входа по умолчанию для каждого нового окна терминала, вызывая .bash_profile вместо .bashrc.
Он рекомендует:
Most of the time you don’t want to maintain two separate config files for login and non-login shells — when you set a PATH, you want it to apply to both. You can fix this by sourcing .bashrc from your .bash_profile file, then putting PATH and common settings in .bashrc.
To do this, add the following lines to .bash_profile:
if [ -f ~/.bashrc ]; then source ~/.bashrc fiNow when you login to your machine from a console .bashrc will be called.
Я использовал дистрибутивы семейства Debian, которые, похоже, выполняют .profile, но не .bash_profile,
тогда как производные RHEL выполняют .bash_profile перед .profile.
Кажется, это беспорядок, когда вам нужно настроить переменные среды для работы в любой ОС Linux.
Не могли бы вы добавить
/etc/bashrc, чтобы заполнить ответ?