В чем разница между.bashrc, .bash_profile и.environment?

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

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

7 ответов

Решение

Основное отличие от конфигурационных файлов оболочки заключается в том, что некоторые из них читаются только оболочками входа в систему (например, когда вы входите в систему с другого хоста или входите в систему с текстовой консоли локального компьютера с 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, Я подозреваю, что это файл вашего дистрибутива, для установки переменных среды независимо от используемой вами оболочки.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для этого добавьте следующие строки в.bash_profile:

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

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

Хорошее место для просмотра - справочная страница bash. Вот онлайн-версия. Ищите раздел "ПРИЗНАНИЕ".

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

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

Другие вопросы по тегам