Разница между .bashrc и .bash_profile

136565
cfischer

В чем разница между .bashrcи .bash_profileи какой я должен использовать?

413
Смотрите также этот похожий вопрос на http://ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile/ Stefan Lasiewski 14 лет назад 2
Если вам нужно более полное объяснение, которое также включает в себя `.profile`, взгляните на этот вопрос: http://superuser.com/questions/789448/choosing-between-bashrc-profile-bash-profile-etc/789705# 789705 Flimm 8 лет назад 0
Этот ответ также охватывает некоторые аспекты https://stackoverflow.com/questions/415403/whats-the-difference-between-bashrc-bash-profile-and-environment Sergey Voronezhskiy 7 лет назад 0

5 ответов на вопрос

481
Gilles

Традиционно, когда вы входите в систему 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. Не стесняйтесь забыть, что это существует.

+1 за хороший пост. ТАКЖЕ спасибо за добавление раздела "вход в систему с графическим интерфейсом против оболочки входа в систему" ... У меня была проблема, когда я думал, что ~ / .profile ВСЕГДА будет выполняться для графического объекта / оболочки ... но он не выполняется, когда пользователь входит в систему через графический логин. Спасибо за решение этой загадки. Trevor Boyd Smith 13 лет назад 11
@Gilles: Не могли бы вы более подробно, с примерами, объяснить, почему запуск оболочки входа в систему в каждом терминале - плохая идея? Это только проблема с настольным Linux? (Я понимаю, что в OS X Terminal каждый раз запускается оболочка входа в систему, и я никогда не замечал каких-либо побочных эффектов (хотя я обычно использую iTerm). Но тогда я не могу думать о многих переменных среды, о которых бы я заботился за пределами терминал. (Может быть, HTTP_PROXY?)) iconoclast 12 лет назад 4
@Brandon Если вы запускаете оболочку входа в систему в каждом терминале, она будет переопределять переменные среды, предоставляемые средой. В повседневных ситуациях вы можете сойти с рук, но это рано или поздно укусит вас, когда вы захотите установить разные переменные в терминале (скажем, попробовать другую версию программы): запустить оболочка входа в систему переопределит ваши локальные настройки. Gilles 12 лет назад 2
Выражение * `~ / .bash_profile` можно использовать вместо` ~ / .profile`, но вам также необходимо включить `~ / .bashrc`, если оболочка является интерактивной. * Вводит в заблуждение, поскольку это ортогональные проблемы. Независимо от того, используете ли вы ~ ~ .bash_profile или ~ / .profile, вы должны включить `~ / .bashrc` в тот, который вы используете, если вы хотите, чтобы настройки оттуда действовали в оболочке входа в систему. Piotr Dobrogost 11 лет назад 4
@PiotrDobrogost `.bash_profile` читается только bash. Если у вас нет этого файла, тогда bash читает `.profile`. Если у вас есть только `.profile`, то он должен включать` .bashrc`, но только если оболочка является интерактивной и представляет собой bash, а не если оболочка входа в систему является какой-либо другой оболочкой. Gilles 11 лет назад 0
@ Жиль Конечно, но то, как формулировка предложения в ответе предполагает, что необходимость включения `~ / .bashrc` связана с выбором` ~ / .bash_profile` вместо `~ / .profile`, что неверно , Если кто-то включает `~ / .bashrc` в любой вид сценария, получаемого во время входа в систему (здесь это либо` ~ / .bash_profile`, либо `~ / .profile`), то это потому, что он хочет, чтобы настройки из` ~ / .bashrc` были применяются к оболочке входа в систему так же, как они применяются к оболочке без входа в систему. Piotr Dobrogost 11 лет назад 2
Это простая задача, чтобы превратить OSX Terminal в интерактивную оболочку без регистрации, как в некоторых других дистрибутивах UNIX. Просто отредактируйте настройки терминала OSX и измените `Shells open with:` на команду `/ usr / bin / login -f -l userid bash -i`. Это изменит соглашение, чтобы запускать все Терминалы как интерактивные оболочки без регистрации. Имейте в виду, что если это будет сделано, то $ HOME / .profile перестанет получать источник. Начнется капитальный ремонт вызовов последовательности запуска. Billy McCloskey 10 лет назад 1
Не могли бы вы обновить свой ответ информацией о `.bash_login`? Это также может быть шанс принять во внимание мои предыдущие комментарии, если хотите. Piotr Dobrogost 10 лет назад 0
@PiotrDobrogost Хорошо, но `.bash_login` - это просто альтернативное имя для` .bash_profile`, которое почти никто не использует. Gilles 10 лет назад 1
Просто провел последний час, выясняя, как это работает в Cygwin. Cygwin, как и Terminal, предоставляет новую оболочку входа в систему для каждого окна. Sean McSomething 7 лет назад 0
Просто для пояснения: «Если оболочка не является оболочкой входа в систему, она не читает` ~ / .profile` »-> Включает ли` ~ / .profile` в этом предложении также `~ / .bash_profile`? Abdul 7 лет назад 0
@Abdul Да, смотрите второй абзац моего ответа. Gilles 7 лет назад 0
Спасибо, Жиль. [Зачем определять переменные среды в `~ / .profile` или` ~ / .bash_profile`, а псевдонимы и функции в `~ / .bashrc`?] (Https://unix.stackexchange.com/questions/431832/why- определить-переменные окружения в своем профиле или-баш-профили и-псевдоним) Tim 6 лет назад 0
@ Я уже много раз отвечал на [unix.se]. Пожалуйста, научитесь искать. Gilles 6 лет назад 0
«Самая распространенная проблема с любой из этих идей ...» Но в целом это звучит как проблема (как вы говорите, в графической среде нет стандартного места для чтения переменных среды). Даже если в графической среде задокументировано местоположение, будет ли это место считываться при входе через, скажем, ssh? Мне кажется, что есть проблемы с каждым подходом, поэтому люди должны выбрать свой яд. jamesdlin 6 лет назад 0
50
Jarvin

Из этой короткой статьи

Согласно man-странице bash, .bash_profile выполняется для оболочек входа в систему, в то время как .bashrc выполняется для интерактивных оболочек без входа в систему.

Что такое оболочка для входа или не входа?

Когда вы входите в систему (например, вводите имя пользователя и пароль) через консоль, либо физически сидите за компьютером при загрузке, либо удаленно через ssh: .bash_profile выполняется для настройки вещей до начальной командной строки.

Но, если вы уже вошли в свою машину и открыли новое окно терминала (xterm) внутри Gnome или KDE, тогда .bashrc выполняется перед командной строкой окна. .bashrc также запускается, когда вы запускаете новый экземпляр bash, набирая / bin / bash в терминале.

Небольшие обновления: «Выполнено», вероятно, вводит в заблуждение термин, оба они получены. Исполняется звучит так, как будто он запускается как скрипт, fork / exec yadda yadda. Он запускается в контексте текущей оболочки. Более того, .bashrc запускается гораздо чаще. Он запускается при каждом запуске bash-скрипта, а также, если у вас нет .bash_profile. Кроме того, в зависимости от того, как вы настроили свои xterms, вы можете создать оболочку с исходным кодом .bash_profile Rich Homolka 14 лет назад 12
34
Rich Homolka

В старые времена, когда псевдо-tty не были псевдо-и фактически, ну, типизированными, и UNIX-системы были доступны модемам так медленно, что вы могли видеть каждую букву, выводимую на экран, эффективность была первостепенной. Чтобы немного повысить эффективность, у вас была концепция главного окна входа в систему и любых других окон, которые вы использовали для реальной работы. В главном окне вы хотите получать уведомления на любую новую почту, возможно, запускать некоторые другие программы в фоновом режиме.

Чтобы поддержать это, оболочка создала файл .profileспециально для «оболочек входа в систему». Это сделало бы особенное, после настройки сеанса. Bash несколько расширил это, чтобы сначала посмотреть на .bash_profile, а затем на .profile, чтобы вы могли поместить туда только вещи bash (чтобы они не испортили оболочку Bourne и т. Д., Которые также рассматривали .profile). Другие оболочки, не входящие в систему, могут просто получить файл rc .bashrc (или .kshrc и т. Д.).

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

Мое предложение - не беспокойтесь об этой разнице, она основана на более старом стиле использования Unix. Устранить разницу в ваших файлах. Все содержимое .bash_profile должно быть:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

И поместите все, что вы действительно хотите установить в .bashrc

Помните, что .bashrc поставляется для всех оболочек, интерактивных и неинтерактивных. Вы можете замкнуть источник для неинтерактивных оболочек, поместив этот код в верхнюю часть .bashrc:

[[ $- != *i* ]] && return

Это плохая идея, см. [Мой ответ] (http://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile/183980#183980). В частности, переменные среды будут установлены только в программах, запускаемых через терминал, а не в программах, запускаемых непосредственно с помощью значка, меню или сочетания клавиш. Gilles 14 лет назад 6
@ Жиль, я не понимаю, почему ты так утверждаешь. С `. $ HOME / .bashrc`, как показал Рич выше, настройки в .bashrc будут доступны в оболочках входа в систему и, следовательно, в среде рабочего стола. Например, в моей системе Fedora `gnome-session` запускается как` - $ SHELL -c gnome-session`, поэтому читается `.profile`. Mikel 12 лет назад 4
@PiotrDobrogost О, да, есть еще одна проблема с ответом Рича. Включение `.bashrc` в` .profile` обычно не работает, потому что `.profile` может выполняться` / bin / sh`, а не bash (например, в Ubuntu для графического входа в систему по умолчанию), и эта оболочка может не быть интерактивным (например, для графического входа в систему). Gilles 11 лет назад 2
@Gilles re: «включая .bashrc в .profile» совсем не то, что было рекомендовано (на самом деле, наоборот). Либо ответ был отредактирован (так не кажется), либо ваши комментарии не соответствуют тому, что говорится. michael 11 лет назад 3
В общем, +1, но я бы добавил к рекомендации «короткое замыкание ... для неинтерактивных оболочек» («в верхней части .bashrc:` [[$ -! = * I *]] && return` «); Мне нравится, что некоторые из моих `.bashrc` выполняются даже для неинтерактивных оболочек, в частности, для установки переменных env при выдаче` ssh hostname `, чтобы удаленные команды выполнялись правильно (даже если оболочка неинтерактивный). Но другие настройки позже в `.bashrc` следует игнорировать. Я обычно проверяю TERM = тупой и / или неустановленный, а затем выручаю рано. michael 11 лет назад 2
15
Flimm

Взгляните на этот отличный пост в блоге ShreevatsaR . Вот выдержка, но перейдите к сообщению в блоге, она включает в себя объяснение таких терминов, как «оболочка входа», блок-схема и аналогичная таблица для Zsh.

Для Баша они работают следующим образом. Прочитайте соответствующий столбец. Выполняет A, затем B, затем C и т. Д. B1, B2, B3 означают, что он выполняет только первый из найденных файлов.

+----------------+-----------+-----------+------+ | |Interactive|Interactive|Script| | |login |non-login | | +----------------+-----------+-----------+------+ |/etc/profile | A | | | +----------------+-----------+-----------+------+ |/etc/bash.bashrc| | A | | +----------------+-----------+-----------+------+ |~/.bashrc | | B | | +----------------+-----------+-----------+------+ |~/.bash_profile | B1 | | | +----------------+-----------+-----------+------+ |~/.bash_login | B2 | | | +----------------+-----------+-----------+------+ |~/.profile | B3 | | | +----------------+-----------+-----------+------+ |BASH_ENV | | | A | +----------------+-----------+-----------+------+ | | | | | +----------------+-----------+-----------+------+ | | | | | +----------------+-----------+-----------+------+ |~/.bash_logout | C | | | +----------------+-----------+-----------+------+ 
Вместо того, чтобы публиковать один и тот же ответ на несколько вопросов, предпочтительнее, если вы можете адаптировать свой ответ к конкретным потребностям автора. Если ответ на оба вопроса одинаков, тогда вы должны опубликовать один ответ и проголосовать, чтобы закрыть остальные вопросы как дубликаты оригинала. Mokubai 8 лет назад 0
@Mokubai Другой вопрос уже помечен как дубликат этого. Flimm 8 лет назад 1
@ElipticalView: если ничего не делать, вы ссылаетесь на строку: `[-z" $ PS1 "] && return`? В таблице в моем ответе приведен список сценариев, запускаемых Bash, независимо от содержимого этих сценариев, если сам сценарий имеет строку `[-z" $ PS1 "] && return`, что, конечно, вступит в силу, но Я не думаю, что это должно означать, что я должен изменить таблицу. Flimm 8 лет назад 0
4
Eliptical View

ЛУЧШИЙ КОММЕНТАРИЙ ДЛЯ ГЛАВЫ / ETC / PROFILE

Основываясь на великолепном ответе Flimm выше, я вставил этот новый комментарий во главе моего профиля Debian / etc / (вам может понадобиться настроить его для своего дистрибутива.) :

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc. # The B1, B2, B3 means it executes only the first of those files found. (A) # or (B2) means it is normally sourced by (read by and included in) the # primary file, in this case A or B2. # # +---------------------------------+-------+-----+------------+ # | | Interactive | non-Inter. | # +---------------------------------+-------+-----+------------+ # | | login | non-login | # +---------------------------------+-------+-----+------------+ # | | | | | # | ALL USERS: | | | | # +---------------------------------+-------+-----+------------+ # |BASH_ENV | | | A | not interactive or login # | | | | | # +---------------------------------+-------+-----+------------+ # |/etc/profile | A | | | set PATH & PS1, & call following: # +---------------------------------+-------+-----+------------+ # |/etc/bash.bashrc | (A) | A | | Better PS1 + command-not-found  # +---------------------------------+-------+-----+------------+ # |/etc/profile.d/bash_completion.sh| (A) | | | # +---------------------------------+-------+-----+------------+ # |/etc/profile.d/vte-2.91.sh | (A) | | | Virt. Terminal Emulator # |/etc/profile.d/vte.sh | (A) | | | # +---------------------------------+-------+-----+------------+ # | | | | | # | A SPECIFIC USER: | | | | # +---------------------------------+-------+-----+------------+ # |~/.bash_profile (bash only) | B1 | | | (doesn't currently exist)  # +---------------------------------+-------+-----+------------+ # |~/.bash_login (bash only) | B2 | | | (didn't exist) ** # +---------------------------------+-------+-----+------------+ # |~/.profile (all shells) | B3 | | | (doesn't currently exist) # +---------------------------------+-------+-----+------------+ # |~/.bashrc (bash only) | (B2) | B | | colorizes bash: su=red, other_users=green # +---------------------------------+-------+-----+------------+ # | | | | | # +---------------------------------+-------+-----+------------+ # |~/.bash_logout | C | | | # +---------------------------------+-------+-----+------------+ # # ** (sources !/.bashrc to colorize login, for when booting into non-gui) 

И эта заметка в заголовке каждого из других файлов установки для ссылки на него:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE 

Стоит отметить, что я думаю, что по умолчанию источники Debian / etc / profile (включают в себя) /etc/bash.bashrc (это когда /etc/bash.bashrc существует). Так что сценарии входа в систему читают оба файла / etc, а не входящие в систему - только bash.bashrc.

Также следует отметить, что /etc/bash.bashrc настроен так, чтобы ничего не делать, если он не запускается в интерактивном режиме. Таким образом, эти два файла предназначены только для интерактивных сценариев.