421

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

5 ответов5

492

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

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

Вы можете вызвать оболочку напрямую в любое время, например, запустив эмулятор терминала в среде графического интерфейса. Если оболочка не является оболочкой входа в систему, она не читает ~/.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 .Не стесняйтесь забыть, что это существует.

51

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

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

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

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

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

35

В старые времена, когда псевдо-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

16

Взгляните на этот отличный пост в блоге 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      |           |      |
+----------------+-----------+-----------+------+
4

ЛУЧШИЙ КОММЕНТАРИЙ ДЛЯ ГЛАВЫ /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 настроен так, чтобы ничего не делать, если он не запускается в интерактивном режиме. Таким образом, эти два файла предназначены только для интерактивных сценариев.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .