Вопрос Разница между .bashrc и .bash_profile


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


401
2017-09-02 14:40


происхождения


См. Также этот аналогичный вопрос в ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile - Stefan Lasiewski
Если вы хотите получить более полное объяснение, которое также включает .profile, посмотрите на этот вопрос: superuser.com/questions/789448/... - Flimm
Этот ответ также охватывает некоторые аспекты stackoverflow.com/questions/415403/... - Sergey Voronezhskiy


ответы:


Традиционно, когда вы входите в систему Unix, система запускает для вас одну программу. Эта программа представляет собой оболочку, то есть программу, предназначенную для запуска других программ. Это оболочка командной строки: вы запускаете другую программу, введя ее имя. По умолчанию оболочка, оболочка Bourne, считывает команды из ~/.profile когда он вызывается в качестве оболочки входа.

Баш - это оболочка, похожая на Бурне. Он читает команды из ~/.bash_profile когда он вызывается в качестве оболочки входа, и если этот файл не существует¹, он пытается прочитать ~/.profile вместо.

Вы можете вызвать оболочку напрямую в любое время, например, запустив эмулятор терминала внутри среды GUI. Если оболочка не является оболочкой входа, она не читает ~/.profile, Когда вы начинаете bash как интерактивную оболочку (то есть не запускаете скрипт), она читает ~/.bashrc (за исключением случаев, когда он вызывается как оболочка входа, тогда он только читает ~/.bash_profile или ~/.profile,

Следовательно:

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

  • ~/.bashrc это место для размещения материала, которое применяется только к самому bash, например, псевдоним и определения функций, параметры оболочки и параметры подсказки. (Вы также можете установить привязки клавиш, но для bash они обычно входят в ~/.inputrc.)

  • ~/.bash_profile может использоваться вместо ~/.profile, но он читается только 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, Не стесняйтесь забывать о существовании.  


471
2017-09-02 19:23



+1 за хороший пост. ТАКЖЕ благодарим вас за добавление раздела о «графическом входе в login vs login shell» ... У меня была проблема, когда я думал, что ~ / .profile ВСЕГДА выполнит для графического / shell ... но он не выполняется, когда пользователь входит в систему через графический логин. Спасибо, что решили эту тайну. - Trevor Boyd Smith
@Gilles: Не могли бы вы объяснить более подробно, с примерами, почему запуск оболочки входа в каждый терминал - плохая идея? Это только проблема с настольным Linux? (Я понимаю, что на OS X Terminal каждый раз запускается оболочка для входа, и я никогда не замечал никаких побочных эффектов (хотя обычно я использую iTerm). Но тогда я не могу придумать много переменных среды, которые мне не нравятся вне (возможно, HTTP_PROXY?)) - iconoclast
@Brandon Если вы запускаете оболочку входа в каждый терминал, это будет переопределять переменные среды, предоставляемые средой. В повседневных ситуациях вы можете уйти от него, но он придет и укусит вас рано или поздно, когда вы хотите настроить разные переменные в терминале (скажем, попробовать другую версию программы): запустить оболочка входа переопределит ваши локальные настройки. - Gilles
Заявление ~/.bash_profile может использоваться вместо ~/.profile, но вам также необходимо включить ~/.bashrc если оболочка является интерактивной. вводит в заблуждение, поскольку это ортогональные проблемы. Независимо от того, используете ли вы ~/.bash_profile или ~/.profile вы должны включить ~/.bashrc в том, который вы используете, если хотите, чтобы настройки оттуда действовали в оболочке входа. - Piotr Dobrogost
@ Gilles Конечно, но способ формулирования предложения в ответе предполагает, что необходимо включить ~/.bashrc имеет какое-то отношение к выбору ~/.bash_profile вместо ~/.profile что неверно. Если кто-то включает ~/.bashrc в любом сценарии, который был получен во время входа в систему (здесь он либо ~/.bash_profile или ~/.profile) заключается в том, что он хочет установить настройки из ~/.bashrc которые будут применяться к оболочке входа так же, как они применяются к оболочке без входа. - Piotr Dobrogost


Из этого короткая статья

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

Что такое логин или недействительный интерфейс?

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

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


50
2017-09-02 14:54



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


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

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

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

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

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

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

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

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


34
2017-09-02 18:10



Это плохая идея, см. мой ответ, В частности, ваши переменные среды будут устанавливаться только в программах, запускаемых через терминал, а не в программах, запускаемых непосредственно с помощью значка или меню или сочетания клавиш. - Gilles
@ Gilles Я не понимаю, почему вы утверждаете это. С .$HOME/.bashrc как показал Rich, настройки в .bashrc будут доступны в оболочках входа и, следовательно, в среде рабочего стола. Например, в моей системе Fedora, gnome-session запускается как -$SHELL -c gnome-session, так .profile читается. - Mikel
@PiotrDobrogost О, да, есть еще одна проблема с ответом Рича. В том числе .bashrc в .profile обычно не работает, потому что .profile может выполняться /bin/sh а не bash (например, на Ubuntu для графического входа по умолчанию), и эта оболочка может не быть интерактивной (например, для графического входа). - Gilles
@Gilles re: «в том числе .bashrc в .profile» совсем не то, что было рекомендовано (на самом деле, наоборот). Либо ответ был отредактирован (он не отображается), либо ваши комментарии не совпадают с тем, что говорится. - michael
В общем, +1, но я бы добавил к рекомендации «короткое замыкание ... для неинтерактивных оболочек» («около вершины .bashrc: [[ $- != *i* ]] && return"), Мне нравятся некоторые из моих .bashrc для выполнения даже для неинтерактивных оболочек, в частности для установки env vars, при выпуске ssh hostname {command}, так что удаленные команды выполняются правильно (хотя оболочка не является интерактивной). Но другие настройки позже .bashrc следует игнорировать. Обычно я проверяю TERM = dumb и / или unset, а затем выхожу рано. - michael


Посмотри на это отличное сообщение в блоге от 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      |           |      |
+----------------+-----------+-----------+------+

14
2017-07-13 08:53



Вместо того, чтобы отправлять один и тот же ответ по нескольким вопросам, предпочтительнее, если вы можете адаптировать свой ответ к конкретным потребностям искателя. Если ответ будет абсолютно одинаковым для обоих вопросов, вы должны опубликовать один ответ и голосовать, чтобы закрыть другие вопросы в качестве дубликатов оригинала. - Mokubai♦
@Mokubai Другой вопрос уже отмечен как дубликат этого. - Flimm
@ElipticalView: с помощью set ничего не делать, вы имеете в виду строку: [ -z "$PS1" ] && return? Таблица в моем ответе дает список скриптов, выполняемых Bash, независимо от содержимого скриптов, если сам скрипт имеет строку [ -z "$PS1" ] && return, конечно, это вступило в силу, но я не думаю, что это должно означать, что я должен изменить таблицу. - Flimm


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

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

# 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

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

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


3
2017-10-18 18:13