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

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

400 голосов | спросил cfischer 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 18:40:34 +0400 2010, 18:40:34

5 ответов


469

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

Bash - это оболочка, похожая на Bourne. Он читает команды из ~/.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. Не стесняйтесь забывать о существовании. Суб>

ответил Gilles 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 23:23:14 +0400 2010, 23:23:14
50

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

  

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

     

Что такое учетная запись или недействительная оболочка?

     

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

     

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

ответил Jarvin 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 18:54:04 +0400 2010, 18:54:04
34

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

Чтобы поддержать это, shells предоставил файл .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

ответил Rich Homolka 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 02 Sep 2010 22:10:20 +0400 2010, 22:10:20
14

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

  

Для Bash они работают следующим образом. Прочитайте соответствующую колонку. Выполняет 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      |           |      |
+----------------+-----------+-----------+------+
ответил Flimm 13 J000000Wednesday16 2016, 11:53:44
3

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

ответил Eliptical View 18 +03002016-10-18T21:13:24+03:00312016bEurope/MoscowTue, 18 Oct 2016 21:13:24 +0300 2016, 21:13:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132