В чем разница между .bash_profile и .bashrc?

245

Чтобы создать псевдоним для терминала в OS X, вы можете поместить псевдонимы в .bash_profileили .bashrc. В чем разница между этими двумя понятиями и почему я выберу псевдонимы для одного, а не для другого?

daviesgeek
источник
5
Не препятствуйте знаниям Unix, но bash - это чистый зверь UNIX, так что вы можете получить более глубокие знания или ответить на этот вопрос несколько раз на партнерском сайте. В Unix
bmike
Также есть .profile ... Смотрите этот вопрос на Переполнение стека.
Яаков Барух
2
Если вы brew install bashи использовать iTerm2, вы можете установить profile -> commandна /usr/local/bin/bashкоторый будет загружаться .bashrcпо умолчанию после .bash_profile. Это также дает Bash 4 вкусности ...
Рэй Фосс
Я слышал, что .bashrc не использовался в течение многих лет, и по умолчанию не будет работать, а .bash_profile - вещь в macosx. И я попробовал .bashrc, и у меня ничего не
вышло,

Ответы:

247

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

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

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

В OS X Terminal по умолчанию запускает оболочку входа в систему каждый раз, так что это немного отличается от большинства других систем, но вы можете настроить это в настройках.

Alex
источник
57
On OS X, Terminal by default runs a login shell every time- Я всегда был так смущен, не осознавая этого. Отличная информация!
вон
1
@ Алекс, Почему в терминале OS X каждый раз запускается оболочка входа?
Pacerier
17
потому что некоторые разработчики Apple изначально не понимали разницу, а теперь она заключена в какой-то тупой затон.
Snowcrash
2
Я на OS X и использую zshell вместо bash и iTerm вместо Terminal. Несмотря на то, что я использую другой терминал и другую оболочку, отличную от обсуждаемой в ответе, OS X все еще рассматривает все как оболочку входа в систему, потому что .zprofileзапускается каждый раз.
Адам Зернер
1
Для тех, кто ищет подробное объяснение комбинаций оболочек для входа / отсутствия входа и интерактивных / неинтерактивных оболочек, и когда они запускают эти файлы конфигурации, см. Unix.stackexchange.com/a/46856/38715
kevinmicke
45

X11 будет смотреть на вас, в .bashrcто время как «обычный» терминал будет смотреть на.bash_profile

Однако, если вы добавите .bash_profileв свой .bashrcфайл следующее , вы можете переместить все в свой файл, чтобы объединить все в одном месте вместо двух:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
крениться
источник
Или вы могли бы просто сделать cd ~ ; ln -s .bashrc .bash_profile.
lhf
5
Эти 2 файла конфигурации имеют явно отдельную функцию. В некоторых случаях необходимо иметь вещи для инициализации в начале сеанса и только там ( ~/.bash_profile). Также часто необходимо, чтобы вещи определялись постепенно на каждом уровне оболочки ( ~/.bashrc). Это не лучшая идея предложить подавить эту свободу.
дан
3
@danielAzuelos: Lurch пропустил эту часть, но OS X Terminal использует источники ~/.bash_profileдля каждого нового окна / вкладки, так что на самом деле нет способа разделить их в терминале.
Мипади
14
@mipadi Все еще есть смысл разделять их. Например, .bash_profileникогда не может быть получен снова в дочернем процессе. Каждый уровень вложенности источников Bash .bashrc, так что если вы положили что - то подобное export A=a:$Aв .bashrc, ваш $Aполучит больше в гнездовом Bash. Я обычно оставляю переменную окружения в профиле и псевдонимы в RC.
Франклин Ю
@FranklinYu Может быть, это не так уж важно для многих людей, но я полностью согласен! Это отличный технический момент, чтобы напомнить людям и заслуживает гораздо больше голосов.
Subfuzion
24

Для macOS код, в который .bash_profileнужно объединить все, .bashrcвыглядит следующим образом:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Это более конкретно для пользователя терминала Mac.

frzhen
источник
6
Хотя это правда, чем это отличается от ответа Лурча от 2012 года ?
Арджан
0

TLDR; используйте .bash_profileдля своих псевдонимов.

Способ совместной работы различных файлов инициализации немного сложнее, и в OSX есть несколько важных особых случаев. Вот основные моменты:

  • Bash на любой платформе выполняет один из нескольких разных файлов в зависимости от того, как он вызывается. Подробности здесь .
  • Приложение терминала OSX делает что-то нестандартное: оно создает каждую новую вкладку или окно, как если бы это была оболочка входа в систему, что означает, что она .bash_profileвызывается. Таким образом, совет TLDR выше.
  • .bashrcтакже является опцией, но она будет вызываться каждый раз, когда вы создаете подоболочку (т.е. вызываете bash), что может создать неэффективность, если вы обновите переменную внутри нее (например, PATH=/bin/foo:$PATH)
  • Другие приложения, имеющие встроенные терминалы, могут следовать соглашению о терминальном приложении или нет. Примечательно, что Visual Studio Code по умолчанию этого не делает .
  • Приложения, вызываемые через графический интерфейс, не создаются из оболочки. Таким образом, существует несколько конкурирующих механизмов для задания переменных среды, которые они должны видеть, которые изменились за эти годы .
  • Отрывки , которые требуют .bashrcот .bash_profileявляются довольно распространенным явлением. Я не рекомендую это, но это предпочтение.
Лео
источник
Почему именно использование .bash_profileпсевдонимов сложно? Элементы, которые вы перечисляете только частично, вообще относятся к псевдонимам, поэтому вместо того, чтобы просто перечислить некоторые маркеры, которые могут объяснить, почему это кажется сложным, можете ли вы предложить способ сделать это проще в рамках этих ограничений?
холме
Я понимаю вашу точку зрения. Дело не в том, что использование .bash_profile является сложным. Дело в том, что способ вызова файлов сложен. Я обновлю.
Лев
Вызов .bashrc из .bash_profile рекомендуется в руководстве по GNU bash - в противном случае как вы устанавливаете переменные и т. Д., Которые вам нужны как в оболочках входа в систему, так и в неинтерактивных?
Марк
Каждый эмулятор терминала, который я использую в разных ОС, имеет возможность запускать новые окна в качестве оболочки для входа, xterm и Xfce, чтобы назвать только два.
fd0