Разница между .bashrc и .bash_profile
Какая разница между .bashrc
и .bash_profile
и какой из них я должен использовать?
Какая разница между .bashrc
и .bash_profile
и какой из них я должен использовать?
Традиционно, когда вы входите в систему Unix, система запускает одну программу для вас. Эта программа представляет собой оболочку, т.е. программу, предназначенную для запуска других программ. Это оболочка командной строки: вы запускаете другую программу, вводя её имя. Оболочка по умолчанию, Bourne shell, читает команды из ~/.profile
, когда она вызывается как оболочка для входа в систему.
Bash - это оболочка, похожая на Bourne. Она читает команды из ~/.bash_profile
, когда вызывается как оболочка для входа в систему, и если этот файл не существует¹, она пытается прочитать ~/.profile
.
Вы можете вызвать оболочку напрямую в любое время, например, запустив терминальный эмулятор в GUI среде. Если оболочка не является оболочкой для входа в систему, она не читает ~/.profile
. Когда вы запускаете bash в качестве интерактивной оболочки (т.е. не для запуска скрипта), она читает ~/.bashrc
(за исключением случаев, когда вызывается как оболочка для входа в систему, тогда она читает только ~/.bash_profile
или ~/.profile
.
Следовательно:
~/.profile
- это место для размещения вещей, которые применимы ко всему сеансу, таких как программы, которые вы хотите запустить при входе в систему (но не графические программы, они идут в другой файл), и определения переменных окружения.
~/.bashrc
это место для размещения вещей, которые применимы только к самому bash, таких как псевдонимы и определения функций, опции оболочки и настройки подсказок. (Вы также можете поместить туда привязки клавиш, но для bash они обычно идут в ~/.inputrc
).
~/.bash_profile
может быть использован вместо ~/.profile
, но он читается только bash, а не любым другим shell'ом. (Это в основном касается тех случаев, когда вы хотите, чтобы ваши инициализационные файлы работали на нескольких машинах, а оболочка для входа в систему не базируется на всех машинах). Это логичное место для включения ~/.bashrc
, если оболочка является интерактивной. Я рекомендую следующее содержимое в ~/.bash_profile
:
В современных унификаторах есть дополнительное усложнение, связанное с ~/.profile
. Если вы входите в графическую среду (то есть, если программа, в которой вы вводите пароль, работает в графическом режиме), вы автоматически не получите оболочку для входа, которая читает ~/.profile
. В зависимости от графической программы входа, оконного менеджера или рабочего стола, который вы запускаете после этого, а также от того, как ваш дистрибутив настроил эти программы, ваш ~/.profile
может быть прочитан, а может и не прочитан. Если это не так, обычно есть другое место, где вы можете определить переменные окружения и программы для запуска при входе в систему, но, к сожалению, нет стандартного места.
Обратите внимание, что здесь и там вы можете увидеть рекомендации либо поместить определения переменных окружения в ~/.bashrc
, либо всегда запускать оболочки для входа в систему на терминалах. И то, и другое - плохая идея. Самая распространенная проблема с любой из этих идей заключается в том, что переменные окружения будут устанавливаться только в программах, запускаемых через терминал, а не в программах, запускаемых напрямую с иконки, меню или сочетания клавиш.
№ Для полноты, по запросу: если .bash_profile
не существует, bash также пытается .bash_login
, прежде чем вернуться к .profile
. Не стесняйтесь забыть, что он существует.
Из этой короткой статьи
Согласно странице bash man, .bash_profile выполняется для оболочек для входа в систему, в то время как .bashrc выполняется для интерактивных оболочек, не связанных с входом в систему.
Что такое оболочка для входа и выхода?
Когда вы входите в систему (например: вводите имя пользователя и пароль) через консоль, либо физически сидите на машине при загрузке, либо удаленно через ssh: .bash_profile выполняется для настройки вещей перед начальной командной строкой.
Но, если Вы уже вошли в систему и открыли новое терминальное окно (xterm) внутри Gnome или KDE, то .bashrc выполняется перед командной строкой окна. .bashrc также выполняется, когда Вы запускаете новый экземпляр bash, вводя /bin/bash в терминале.
В старые времена, когда псевдо tty’s не были псевдо и на самом деле, ну, печатали, а доступ к UNIX'у осуществлялся модемами настолько медленно, что можно было видеть, как каждая буква печаталась на экране, эффективность была превыше всего. Для некоторой эффективности у вас была концепция главного окна входа и любых других окон, которые вы использовали для реальной работы. В главном окне Вы хотели бы получать уведомления на любую новую почту, возможно, запускать другие программы в фоновом режиме.
Для поддержки этого, оболочки исходили из файла .profile
специально для ‘оболочек входа’. Это сделает специальную, после установки сеанса. Бэш немного расширил его, чтобы сначала посмотреть на .bash_profile перед .profile, таким образом, вы могли поместить туда bash only things (чтобы они не испортили оболочку Bourne, и т.д., которая также посмотрела на .profile). Другие оболочки, не входящие в .login, просто исходят из rc-файла, .bashrc (или .kshrc, и т.д.).
Теперь это немного анахронизм. Вы не входите в основную оболочку так часто, как в оконный менеджер gui. Главное окно ничем не отличается от любого другого окна.
Мое предложение - не беспокойтесь об этой разнице, она основана на старом стиле использования unix. Устраните разницу в ваших файлах. Все содержимое .bash_профиля должно быть полным:
[-f $HOME/.bashrc] && . $HOME/.bashrc
И поместите все, что вы на самом деле хотите установить в .bashrc
Помните, что .bashrc исходит для всех оболочек, интерактивных и неинтерактивных. Вы можете закоротить источник неинтерактивных оболочек, поместив этот код в верхнюю часть .bashrc:
[[$- != *i*]] && return
.
Взгляните на этот отличный пост в блоге 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 | | |
+----------------+-----------+-----------+------+
A BETTER COMMENT FOR THE HEAD OF /ETC/PROFILE
Основываясь на замечательном ответе 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, в то время как файлы без входа в систему читают только bash.bashrc.
Также обратите внимание, что /etc/bash.bashrc настроен на ничего не делать, когда он не запускается в интерактивном режиме. Поэтому эти два файла предназначены только для интерактивных скриптов.
Логика настройки самого bash’s не является безумно сложной и объясняется в других ответах на этой странице, на сервере и во многих блогах. Проблема, однако, в том, что что дистрибутивы Linux делают из bash, я имею в виду сложные и различные способы настройки bash по умолчанию. http://mywiki.wooledge.org/DotFiles кратко упоминает некоторые из этих причуд. Вот один пример трассировки на Fedora 29, он показывает, какие файлы исходники каких других файлов и в каком порядке для очень простого сценария: удаленное соединение с ssh, а затем запуск другой подоболочки:
ssh fedora29
└─ -bash # login shell
├── /etc/profile
| ├─ /etc/profile.d/*.sh
| ├─ /etc/profile.d/sh.local
| └─ /etc/bashrc
├── ~/.bash_profile
| └─ ~/.bashrc
| └─ /etc/bashrc
|
|
└─ $ bash # non-login shell
└─ ~/.bashrc
└─ /etc/bashrc
└─ /etc/profile.d/*.sh
Самая сложная логика Fedora находится в /etc/bashrc
. Как видно выше, /etc/bashrc
- это файловый bash, о котором сам по себе не знает, то есть не напрямую. Федора /etc/bashrc
проверяет:
…. и затем делает совершенно разные вещи в зависимости от них.
Если вы думаете, что можете вспомнить вышеприведенный график, то очень плохо, потому что этого недостаточно: этот график просто описывает один сценарий, немного разные вещи происходят при запуске неинтерактивных сценариев или при запуске графического сеанса. Я опустил ~/.profile
. Я опустил сценарии bash_completion
. По причинам обратной совместимости, обращение к bash как /bin/sh
вместо /bin/bash
меняет его поведение. Что насчет zsh и других оболочек? И, конечно, разные дистрибутивы Linux поступают по-разному, например, Debian и Ubuntu поставляются с нестандартной версией bash, в них есть специфические для Debian настройки. В частности, он ищет необычный файл: /etc/bash.bashrc
. Даже если вы придерживаетесь одного дистрибутива Linux, он, вероятно, эволюционирует со временем. Подождите: мы даже не касались MacOS, FreeBSD,…. Наконец, давайте подумаем для пользователей, застрявших с еще более творческими способами, которыми их администраторы настраивали систему, которую они должны использовать.
Как показывает бесконечный поток обсуждений на эту тему, это потерянная причина. До тех пор, пока вы просто хотите добавить новые значения, некоторых “проб и ошибок”, как правило, достаточно. Настоящее веселье начинается, когда вы хотите modify в одном (пользовательском) файле, что-то уже определенное в другом (в /etc). Затем будьте готовы потратить некоторое время на разработку решения, которое никогда не будет переносимым.
В заключение, вот “исходный график” для того же самого простого сценария на Clear Linux по состоянию на июнь 2019:
ssh clearlinux
└─ -bash # login shell
├── /usr/share/defaults/etc/profile
| ├─ /usr/share/defaults/etc/profile.d/*
| ├─ /etc/profile.d/*
| └─ /etc/profile
├── ~/.bash_profile
|
|
└─ $ bash # non-login shell
├─ /usr/share/defaults/etc/bash.bashrc
| ├─ /usr/share/defaults/etc/profile
| | ├─ /usr/share/defaults/etc/profile.d/*
| | ├─ /etc/profile.d/*
| | └─ /etc/profile
| └─ /etc/profile
└─ ~/.bashrc
```.