Какая разница между .bashrc,.bash_profile и .environment?

Я использовал несколько разных систем на основе nix за эти годы, и кажется, что каждый вкус Bash, который я использую, имеет другой алгоритм для определения сценариев запуска для запуска. Для целей таких задач, как настройка переменных среды и псевдонимов и сообщений о запуске печати (например, MOTD), какой запуск script является подходящим местом для этого?

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

Ответ 1

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

Затем у вас есть конфигурационные файлы, которые читаются "интерактивными" оболочками (как и те, которые подключены к терминалу (или псевдотерминалу, в случае, например, эмулятора терминала, запущенного под системой окон). с именами типа .bashrc, .tcshrc, .zshrc и т.д.

bash усложняет это тем, что .bashrc является , только прочитанным оболочкой, которая является как интерактивной, так и не-login, поэтому вы обнаружите, что большинство людей сообщают своим .bash_profile также прочитайте .bashrc с чем-то вроде

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

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

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

.profile - это просто имя входа script, которое первоначально использовалось /bin/sh. bash, будучи в целом обратной совместимостью с /bin/sh, будет читать .profile, если таковой существует.

Ответ 2

Это просто. Это объясняется в 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 выполняет свои файлы запуска". Я думаю, что это пятно:) В нем объясняется, что такое "интерактивная" оболочка.

Bash не знает о .environment. Я подозреваю, что файл вашего дистрибутива, чтобы установить переменные среды независимо от оболочки, которую вы водите.

Ответ 3

Классически, ~/.profile используется Bourne Shell и, вероятно, поддерживается Bash как устаревшая мера. Опять же, ~/.login и ~/.cshrc были использованы C Shell - я не уверен, что Bash использует их вообще.

~/.bash_profile будет использоваться один раз при входе в систему. ~/.bashrc script читается каждый раз, когда запускается оболочка. Это аналогично /.cshrc для C Shell.

Одним из следствий является то, что материал в ~/.bashrc должен быть максимально легким (минимальным), чтобы уменьшить накладные расходы при запуске оболочки без входа.

Я считаю, что файл ~/.environment является файлом совместимости для Korn Shell.

Ответ 4

Я нашел информацию о .bashrc и .bash_profile здесь, чтобы подвести итог:

.bash_profile выполняется, когда вы авторизоваться. Предмет, который вы положили, может быть вашей PATH и других важных переменные среды.

.bashrc используется для недействительных систем. Я не уверен, что это значит. я знаю что RedHat выполняет его каждый раз, когда вы начинаете другой оболочки (su для этого пользователя или просто вызывая bash снова). Вы можете хотите добавить псевдонимы туда, но снова Я не уверен, что это значит. я просто игнорируйте его сам.

.profile является эквивалентом .bash_profile для корня. я думаю имя изменено, чтобы shells (csh, sh, tcsh) также используют его. (вам не нужен он как пользователь)

Существует также .bash_logout, который выполняется, да, хорошо догадаться... выйти из системы. Возможно, вы захотите остановить деамонов или даже сделайте небольшое домашнее хозяйство. Ты можешь также добавьте "clear" там, если вы хотите очистите экран при выходе из системы.

Также есть полное отслеживание каждого из конфигурационных файлов здесь

Это, вероятно, даже зависимые от дистрибутива, не все дистрибутивы предпочитают иметь с ними каждую конфигурацию, а некоторые - еще больше. Но когда они имеют одно и то же имя, они обычно включают один и тот же контент.

Ответ 5

Согласно Josh Staiger, Mac OS X Terminal.app по умолчанию запускает оболочку входа, а не оболочку не для входа в систему для каждого нового окно терминала, вызывая .bash_profile вместо .bashrc.

Он рекомендует:

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

Чтобы сделать это, добавьте следующие строки в .bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

Теперь, когда вы входите в свой машина из консоли .bashrc будет вызываться.

Ответ 6

Хорошее место для просмотра - это страница руководства bash. Здесь онлайн-версия. Найдите раздел "INVOCATION".

Ответ 7

Я использовал дистрибутивы семейства Debian, которые, как представляется, выполняют .profile, но не .bash_profile, тогда как производные RHEL выполняют .bash_profile до .profile.

Кажется, беспорядок, когда вам нужно настроить переменные среды для работы в любой ОС Linux.