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

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

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

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

В соответствии с страницей bash man .bash_profile выполняется для оболочек входа, а .bashrc выполняется для интерактивных оболочек без входа.

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

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

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

Еще в прежние времена, когда псевдо-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

Взгляните на это превосходное сообщение в блоге ShreevatsaR . Вот выдержка, но перейдите к сообщению в блоге, в нем есть объяснение терминов типа «оболочка входа», блок-схема и аналогичная таблица для 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 | | | +----------------+-----------+-----------+------+ 

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

  • Mac OS X .bashrc не работает
  • Баш, как глобально исправить ^ H и ^? Проблемы с обратным пространством
  • Могу ли я узнать, есть ли у меня сеанс scp в моем .bashrc?
  • Узнайте, где определена $ PATH
  • Почему псевдонимы, определенные в файле .bashrc, не работают?
  • Переменные среды в bash_profile или bashrc?
  • Давайте будем гением компьютера.