Различие между .bashrc и .bash_profile

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

451
задан 17.02.2013, 22:49

3 ответа

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

Bash является подобной Границе оболочкой. Это читает команды из ~/.bash_profile когда это вызывается как оболочка входа в систему, и если тот файл не существует ¹, это пытается читать ~/.profile вместо этого.

Можно вызвать оболочку непосредственно в любое время, например, путем запуска эмулятора терминала в среде GUI. Если оболочка не является оболочкой входа в систему, она не читает ~/.profile. При запуске удара как интерактивной оболочки (т.е. не запускать скрипт), он читает ~/.bashrc (кроме тех случаев, когда вызванный как оболочка входа в систему, затем это только читает ~/.bash_profile или ~/.profile.

Поэтому:

  • ~/.profile место состоит в том, чтобы поместить материал, который относится к Вашей целой сессии, такой как программы, которые Вы хотите запустить, когда Вы входите в систему (но не графические программы, они входят в другой файл), и определения переменной среды.

  • ~/.bashrc место состоит в том, чтобы поместить материал, который применяется только для избиения себя, такие как псевдоним и функциональные определения, опции оболочки и быстрые настройки. (Вы могли также поместить привязки клавиш там, но для удара они обычно входят ~/.inputrc.)

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

520
ответ дан 07.12.2019, 07:34

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

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

Что такое оболочка входа в систему или невхода в систему?

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

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

53
ответ дан 07.12.2019, 07:34

Назад в былые времена, когда псевдо tty's не были псевдо и на самом деле, ну, в общем, введенный, и UNIXes, были получены доступ модемами, настолько медленными, Вы видели, что каждая буква была распечатана на Ваш экран, эффективность была главной. Для помощи эффективности несколько, у Вас было понятие основного окна входа в систему и безотносительно других окон, Вы раньше на самом деле работали. В Вашем главном окне Вы хотели бы уведомления любой новой почте, возможно запустили бы некоторые другие программы в фоновом режиме.

Для поддержки этого оболочки получили файл .profile конкретно на 'оболочках входа в систему'. Это сделало бы специальное предложение, однажды установка сессии. Bash расширил это несколько для рассмотрения .bash_profile сначала прежде .profile, этот способ, которым Вы могли поместить удар только вещи там (таким образом, они не завинчивают Оболочку Bourne, и т.д., который также посмотрел на .profile). Другие оболочки, невход в систему, просто получили бы емкостно-резистивный файл, .bashrc (или .kshrc, и т.д.).

Это - что-то вроде анахронизма теперь. Вы не входите в основную оболочку так, как Вы входите в gui менеджер окон. Нет никакого главного окна, несколько отличающегося, чем какое-либо другое окно.

Мое предложение - не волнуется об этом различии, оно основано на более старом стиле использования Unix. Устраните различие в своих файлах. Все содержание .bash_profile должно быть:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

И помещенный все Вы на самом деле хотите установить в .bashrc

Помните, что .bashrc получен для всех оболочек, интерактивных и неинтерактивных. Можно сорвать определение источника для неинтерактивных оболочек путем помещения этого кода около вершины .bashrc:

[[ $- != *i* ]] && return

35
ответ дан 07.12.2019, 07:34

Теги

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