В чем разница между.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.