разница между .bashrc и .bash\_profile

<p>в чем разница между <code>.bashrc</code> и <code>.bash\_profile</code> и какую мне использовать?</p>

<p>традиционно, когда вы входите в систему unix, система запускает одну программу для вас. эта программа представляет собой оболочку, то есть программу, предназначенную для запуска других программ. это командная строка shell: вы запускаете другую программу, набирая ее имя. оболочка по умолчанию, bourne shell, читает команды из <code>~/.profile</code>, когда она вызывается как оболочка входа.</p><p>баш - похожая на борна оболочка. он читает команды из <code>~/.bash\_profile</code>, когда он вызывается в качестве оболочки входа в систему, и если этот файл не существует¹, вместо этого он пытается прочитать <code>~/.profile</code>.</p><p>вы можете вызвать shell напрямую в любое время, например, запустив эмулятор терминала в среде графического интерфейса. если оболочка не является оболочкой входа в систему, она не читает <code>~/.profile</code>. когда вы запускаете bash в виде интерактивной оболочки (т.е. не для запуска скрипта), он читает <code>~/.bashrc</code> (кроме случаев, когда он вызывается как оболочка входа в систему, тогда он читает только <code>~/.bash\_profile</code> или <code>~/.profile</code>).</p><p>следовательно:</p><ul> <li> <p><code>~/.profile</code> - это место для размещения материалов, относящихся ко всему сеансу, таких как программы, которые вы хотите запустить при входе в систему (но не графические программы, они идут в другой файл), а также определения переменных среды.</p> </li> <li> <p><code>~/.bashrc</code> - это место для размещения материалов, которые применяются только к самому bash, таких как определения псевдонимов и функций, параметры оболочки и настройки подсказок. (вы также можете разместить здесь привязки клавиш, но для bash они обычно идут в <code>~/.inputrc</code>.)</p> </li> <li> <p><code>~/.bash\_profile</code> может использоваться вместо <code>~/.profile</code>, но он читается только bash, а не какой-либо другой оболочкой. (это в основном вызывает беспокойство, если вы хотите, чтобы ваши файлы инициализации работали на нескольких машинах, а оболочка входа в систему не работает на всех из них.) это логичное место для включения <code>~/.bashrc</code>, если оболочка является интерактивной. я рекомендую следующее содержание в <code>~/.bash\_profile</code>:</p> <pre><code>if [ -r ~/.profile ]; then . ~/.profile; fi case "$-" in i) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac  в современных unix есть дополнительное усложнение, связанное с ~/.profile. если вы входите в графическую среду (то есть, если программа, в которой вы вводите пароль, работает в графическом режиме), вы автоматически не получаете оболочку входа, которая читает ~/.profile. в зависимости от графической программы входа в систему, от оконного менеджера или среды рабочего стола, которые вы запускаете впоследствии, и от того, как ваш дистрибутив настроил эти программы, ваш ~/.profile может или не может быть прочитан. если это не так, обычно есть другое место, где вы можете определить переменные среды и программы, которые будут запускаться при входе в систему, но, к сожалению, стандартного расположения нет.обратите внимание, что вы можете увидеть здесь и там рекомендации, чтобы либо поместить определения переменных среды в ~/.bashrc, либо всегда запускать оболочки входа в систему в терминалах. оба плохие идеи. наиболее распространенная проблема с любой из этих идей заключается в том, что переменные среды будут устанавливаться только в программах, запускаемых через терминал, а не в программах, запускаемых непосредственно с помощью значка, меню или сочетания клавиш.¹ для полноты, по запросу: если .bash_profile не существует, bash также пытается .bash_login, прежде чем вернуться к .profile. не стесняйтесь забыть, что это существует.

из этого <a href="http://joshstaiger.org/archives/2005/07/bash_profile_vs.html">короткая статья <blockquote> согласно man-странице bash, .bash_profile выполняется для оболочек входа в систему, в то время как .bashrc выполняется для интерактивных оболочек без входа в систему. <strong>что такое оболочка для входа или не входа в систему?</strong> когда вы входите в систему (например, вводите имя пользователя и пароль) через консоль, либо физически сидите за компьютером при загрузке, либо удаленно через ssh: .bash_profile выполняется для настройки вещей перед начальной командой prompt. но если вы уже вошли в свою машину и открыли новое окно терминала (xterm) внутри gnome или kde, тогда .bashrc выполняется перед командой окна prompt. .bashrc также запускается, когда вы запускаете новый экземпляр bash, набирая/bin/bash в терминале. </blockquote>

в старые времена, когда псевдо-tty не были псевдо-и фактически, ну, типизированными, и unix-системы были доступны модемам так медленно, что вы могли видеть каждую букву, выводимую на экран, эффективность была первостепенной. чтобы немного повысить эффективность, у вас была концепция главного окна входа в систему и любых других окон, которые вы использовали для реальной работы. в главном окне вы хотите получать уведомления на любую новую почту, возможно, запускать некоторые другие программы в фоновом режиме.для поддержки этого оболочка поставила файл .profile специально для «логинов оболочки». это сделало бы особенное, после настройки сеанса. bash несколько расширил это, чтобы сначала посмотреть на .bash_profile, а затем на .profile, чтобы вы могли поместить туда только вещи bash (чтобы они не испортили bourne shell и т.д., которые также рассматривали .profile). другие оболочки, не входящие в систему, могут просто получить rc-файл .bashrc (или .kshrc и т.д.).это немного анахронизм сейчас. вы не входите в основную оболочку столько, сколько вы входите в менеджер окон графического интерфейса. главное окно не отличается от любого другого окна.мое предложение - не беспокойтесь об этой разнице, она основана на более старом стиле использования unix. устранить разницу в ваших файлах. все содержимое .bash_profile должно быть:[ -f $home/.bashrc ] && . $home/.bashrcи поместите все, что вы действительно хотите установить в .bashrcпомните, что .bashrc поставляется для всех оболочек, интерактивных и неинтерактивных. вы можете замкнуть источник для неинтерактивных оболочек, поместив этот код в верхнюю часть .bashrc:[[ $- != *i* ]] && return</code></p>

<p>посмотрите на это <a href="http://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/">отличное сообщение в блоге от shreevatsar</a> . вот выдержка, но перейдите к сообщению в блоге, оно включает в себя объяснение таких терминов, как «login shell», блок-схему и аналогичную таблицу для zsh.</p><blockquote> <p>для баша они работают следующим образом. прочитайте соответствующий столбец. выполняет a, затем b, затем c и т.д. b1, b2, b3 означают, что он выполняет только первый из найденных файлов.</p> </blockquote><pre><code>+----------------+-----------+-----------+------+ | |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 | | | +----------------+-----------+-----------+------+ </code></pre>

<p><strong> лучший комментарий к head/etc/profile </strong></p><p>основываясь на превосходном ответе flimm выше, я вставил этот новый комментарий во главе моего debian/etc/profile,<em> (возможно, вам придется настроить его для своего дистрибутива.) </em>:</p><pre><code># 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) </code></pre><p>и эта заметка в заголовке каждого из других файлов установки для ссылки на него:</p><pre><code># tip: see table in /etc/profile of bash setup files and their load sequence </code></pre><p>стоит отметить, что я думаю, что по умолчанию источники/etc/profile debian (включают в себя) /etc/bash.bashrc (это когда /etc/bash.bashrc существует). так что сценарии входа в систему читают оба файла/etc, а не входящие в систему - только bash.bashrc.</p><p>также следует отметить, что /etc/bash.bashrc настроен так, чтобы ничего не делать, если он не запускается в интерактивном режиме. таким образом, эти два файла предназначены только для интерактивных сценариев.</p>