Традиционно, когда вы входите в систему Unix, система запускает одну программу для вас. Эта программа представляет собой оболочку, то есть программу, предназначенную для запуска других программ. Это оболочка командной строки: вы запускаете другую программу, набирая ее имя. Оболочка по умолчанию, оболочка Bourne, считывает команды, ~/.profile
когда она вызывается как оболочка входа в систему.
Баш - похожая на Борна оболочка. Он читает команды, ~/.bash_profile
когда он вызывается как оболочка входа в систему, и если этот файл не существует¹, ~/.profile
вместо этого он пытается читать .
Вы можете вызвать оболочку напрямую в любое время, например, запустив эмулятор терминала в среде графического интерфейса. Если оболочка не является оболочкой входа, она не читается ~/.profile
. Когда вы запускаете bash как интерактивную оболочку (то есть, чтобы не запускать скрипт), он читает ~/.bashrc
(кроме случаев, когда он вызывается как оболочка входа в систему, тогда он читает только ~/.bash_profile
или ~/.profile
.
Следовательно:
~/.profile
это место для размещения материала, который применяется ко всему сеансу, например, программы, которые вы хотите запустить при входе в систему (но не графические программы, они идут в другой файл), а также определения переменных среды.~/.bashrc
это место для размещения материалов, которые применяются только к самому bash, таких как определения псевдонимов и функций, параметры оболочки и настройки приглашений. (Вы также можете разместить здесь привязки клавиш, но для bash они обычно используются~/.inputrc
.)~/.bash_profile
может использоваться вместо~/.profile
, но он читается только bash, а не какой-либо другой оболочкой. (Это в основном вызывает беспокойство, если вы хотите, чтобы ваши файлы инициализации работали на нескольких машинах, а ваша оболочка для входа в систему не является bash на всех из них.) Это логичное место для включения,~/.bashrc
если оболочка является интерактивной. Я рекомендую следующее содержание в~/.bash_profile
:if [ -r ~/.profile ]; then . ~/.profile; fi case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
На современных устройствах есть дополнительное осложнение, связанное с ~/.profile
. Если вы входите в графическую среду (то есть, если программа, в которой вы вводите пароль, работает в графическом режиме), вы автоматически не получаете оболочку входа, которая читает ~/.profile
. В зависимости от графической программы входа в систему, от оконного менеджера или среды рабочего стола, которые вы запускаете впоследствии, и от того, как ваш дистрибутив настроил эти программы, вы ~/.profile
можете или не можете прочитать. Если это не так, обычно есть другое место, где вы можете определить переменные среды и программы, которые будут запускаться при входе в систему, но, к сожалению, нет стандартного местоположения.
Обратите внимание, что вы можете увидеть здесь и там рекомендации, чтобы либо помещать определения переменных среды, ~/.bashrc
либо всегда запускать оболочки входа в систему в терминалах. Оба плохие идеи. Наиболее распространенная проблема с любой из этих идей заключается в том, что переменные среды будут устанавливаться только в программах, запускаемых через терминал, а не в программах, запускаемых непосредственно с помощью значка, меню или сочетания клавиш.
¹ Для полноты, по запросу: если .bash_profile
не существует, bash также пытается, .bash_login
прежде чем вернуться к .profile
. Не стесняйтесь забыть, что это существует.