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

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

Не препятствуйте знанию Unix здесь, но bash - это чистый зверь UNIX, поэтому вы можете получить больше знаний или получить ответ на этот вопрос несколько раз на партнерском сайте. В Unix существует более 200 пар вопросов и ответов bashrc .
Также есть .profile... См. этот вопрос в Stack Overflow.
Если вы brew install bashиспользуете iTerm2, вы можете установить profile -> command, какой из /usr/local/bin/bashних будет загружаться .bashrcпо умолчанию после .bash_profile. Это также дает вам вкусности Bash 4 ...
Если вам интересно, почему терминал не работает .bash_profile, это потому, что с macOS Catalina переключилась с bashна zsh; поэтому теперь вы должны использовать .zprofileвместо .bash_profile.

Ответы (5)

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

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

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

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

On OS X, Terminal by default runs a login shell every time- Я всегда был так сбит с толку, не осознавая этого. Отличная информация!
Я на OS X и использую zshell вместо bash и iTerm вместо терминала. Несмотря на то, что я использую другой терминал и другую оболочку, чем обсуждается в ответе, OS X, похоже, по-прежнему рассматривает все как оболочку входа в систему, потому что .zprofileзапускается каждый раз.
Для тех, кто ищет подробное объяснение комбинаций входа/не входа и интерактивных/неинтерактивных оболочек и когда они запускают эти файлы конфигурации, см. unix.stackexchange.com/a/46856/38715
Это действительно хороший ответ. Это помогло мне понять, почему мне всегда нужно выполнять действия вручную после установки RVM в Ubuntu или Fedora, чтобы заставить его работать, где я вырезал и вставлял строку [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*от ~/.bash_profileдо ~/.bashrc. Кажется, что RVM устанавливается так, как если бы он всегда устанавливался на Mac. Предполагается, что каждый раз, когда терминал запускается, это будет оболочка входа в систему. Если вы используете свой компьютер по-другому, когда вы входите в систему только один раз, вам нужно настроить некоторые вещи.
Следует отметить, что новое окно или вкладка Terminal.app будет искать и исходить ~/.bash_profileили ~/.profileкак уже упоминалось, но если вы создадите новый bash, используя что-то вроде exec bashили bashиз этого нового окна/вкладки, он будет только искать и исходить ~/.bashrc. Чтобы избежать этого, используйте exec bash -lили bash -lдля порождения нового bash в качестве оболочки для входа в систему, которая затем будет искать файлы .bash_profile/.profile. То же самое для новых окон, созданных в tmux/screen, они будут иметь только исходный код ~/.bashrc.

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

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

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
Или вы могли бы просто сделать cd ~ ; ln -s .bashrc .bash_profile.
Эти 2 конфигурационных файла имеют совершенно разные функции. В некоторых случаях необходимо иметь вещи для инициализации в начале сеанса и только там ( ~/.bash_profile). Также часто необходимо иметь вещи, которые нужно определять постепенно на каждом уровне оболочки ( ~/.bashrc). Предлагать подавить эту свободу — не лучшая идея.
@danielAzuelos: Lurch пропустил эту часть, но терминал OS X использует источники ~/.bash_profileдля каждого нового окна/вкладки, поэтому на самом деле нет способа разделить их в том, что касается терминала.
@mipadi Их все еще стоит разделить. Например, .bash_profileникогда не может быть получен снова в дочернем процессе. Каждый уровень вложенных источников Bash .bashrc, поэтому, если вы поместите что-то вроде export A=a:$A, .bashrcваш $Aвложенный Bash станет длиннее. Обычно я оставляю переменную окружения в профиле, а псевдонимы — в RC.
@FranklinYu Возможно, для многих это не так уж важно, но я полностью согласен! Это отличный технический момент, чтобы напомнить людям, и он заслуживает большего количества голосов.
я видел что-то вроде <. ~/.bashrc > вместо < source ~/.bashrc>, есть ли разница?
@DingxinXu точка перед путем к файлу (например . ~/.bashrc, ) является ярлыком для source, так что никакой разницы. См. unix.stackexchange.com/questions/114300/…
Одна проблема с этим. Когда вы запускаете source .bashrcв Терминале, имея if [ -f $HOME/.bashrc ]; then source $HOME/.bashrc fiдубликаты .bash_profileлюбых путей, которые вы добавили в .bashrc.

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

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

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

Хотя это правда, чем это отличается от ответа Ларча от 2012 года ?

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, чтобы назвать только два.

Для ubuntu/debain я добавляю этот код в конце .bashrc:

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

Теперь мои псевдонимы действуют во всех новых открытых терминалах (или вкладках)