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

130

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

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

Адам Розенфилд
источник

Ответы:

73

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

Cos
источник
48

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

Йоханнес Шауб - Литб
источник
1
Не могли бы вы дополнить /etc/bashrcответ?
Nemoden
9

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

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

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

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

Джонатан Леффлер
источник
7

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

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

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

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

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

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

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

Филип Экберг
источник
4

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

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

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

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

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

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

Роза Перроне
источник
2

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

PolyThinker
источник
0

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

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

seismick
источник