Почему ~/.bash_profile не получает исходный код при открытии терминала?

Проблема

У меня есть виртуальная машина Ubuntu 11.04, и я хотел настроить свою среду разработки Java. Я сделал следующее

  1. sudo apt-get install openjdk-6-jdk
  2. Добавлены следующие записи в ~/.bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdkexport PATH=$PATH:$JAVA_HOME/bin
  3. Сохраните изменения и выйдите

  4. Снова откройте терминал и введите следующее

    echo $JAVA_HOME   (blank)echo $PATH        (displayed, but not the JAVA_HOME value)
  5. Ничего не произошло, как если бы экспорт JAVA_HOME и его добавление к ПУТИ никогда не выполнялись.

Решение

Я должен был пойти в ~/.bashrc и добавьте следующую запись в конец файла

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up. ~/.bash_profile

Вопросы

  1. Почему я должен был это сделать? Я думал, что bash_profile, bash_login или profile в отсутствие этих двух выполняются первыми перед bashrc.
  2. Был ли в этом случае мой терминал a не вход в систему раковина?
  3. Если да, то почему при выполнении su после терминала и вводе пароля он не выполнял профиль, в котором я также установил экспорт, упомянутый выше?

~/.bash_profile предоставляется bash только при запуске в режиме входа в систему. Обычно это происходит при входе в систему с помощью консоли (Ctrl+Alt+F1..F6), подключитесь через ssh или используйте sudo -i или su - для выполнения команд от имени другого пользователя.

Когда вы входите в систему графически, ~/.profile будет специально создан скриптом, который запускает gnome-session (или любую другую среду рабочего стола, которую вы используете). Так ~/.bash_profile не отображается вообще, когда вы входите в систему графически.

Когда вы открываете терминал, терминал запускает bash в интерактивном режиме (без входа в систему), что означает, что он будет исходить ~/.bashrc.

Правильное место для размещения этих переменных среды находится в ~/.profile, и эффект должен быть очевиден при следующем входе в систему.

Снабжение ~/.bash_profile от ~/.bashrc это неправильное решение. Предполагается, что все должно быть наоборот; ~/.bash_profile должен быть источником ~/.bashrc.

Видеть Точечные файлы для более подробного объяснения, включая некоторую историю того, почему все так, как есть.

(Кстати, при установке openjdk через apt символические ссылки должны быть настроены пакетом, так что вам действительно не нужно устанавливать JAVA_HOME или изменить PATH)

Вы можете проверить, запущена ли ваша оболочка Bash как оболочка входа в систему, выполнив:

shopt login_shell

Если ответ будет off вы не используете оболочку входа в систему.

Прочтите руководство по Bash вызов раздел о том, как Bash считывает (или не считывает) различные файлы конфигурации.

Выдержка из man bash:

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с --login опция, он сначала считывает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла он ищет ~/.bash_profile, ~/.bash_login, и ~/.profile, в таком порядке, и считывает и выполняет команды из первой, которая существует и доступна для чтения.

su с другой стороны, по умолчанию также не запускается оболочка входа в систему, вы должны указать ей сделать это с помощью --login вариант.

Я думаю, стоит упомянуть, что вы можете изменить настройки gnome-terminal по умолчанию, чтобы использовать оболочку входа в систему (т.Е. bash -l), отредактировав настройки профиля.

>>перейдите в раздел "Редактирование" - Настройки профиля - вкладка "Заголовок и команда" установите флажок "Выполнить команду как оболочку входа в систему".

Если вы откроете терминал или запустите su оболочка выполняется не как оболочка входа в систему, а как обычная интерактивная оболочка. Итак, он гласит ~/.bashrc но не ~/.bash_profile. Ты можешь бежать su с -l возможность заставить его запускать вашу оболочку в качестве оболочки входа в систему.

Когда вы работаете с графическим интерфейсом оболочка обычно никогда не запускается как оболочка входа в систему поэтому обычно можно поместить все ваши данные в ~/.bashrc.

ТЛ;Д-Р

В классической рекомендуемой установке ubuntu, ~/.bash_profile оценивается только в определенных случаях. И в этом есть смысл.

Положи свои вещи в ~/.bashrc, он будет оцениваться каждый раз.

Хорошо, я хочу понять, почему это имеет смысл?

Ключевые точки, чтобы понять, что происходит:

  • все процессы в linux есть и использует окружающую среду переменные
  • переменными среды являются унаследованный
  • таким образом, устанавливая их однажды на отца всего вашего процесса достаточно (особенно если он требует некоторого времени вычислений).
  • отец всего вашего процесса обычно запускается после вас авторизоваться на вашем устройстве (укажите свои учетные данные).
  • есть вещи, которые вы, возможно, захотите сделать только один раз при входе в систему на вашем компьютере (например, проверьте наличие новой почты ...).

Таким образом, время "входа в систему" обычно составляет:

  • В консольном режиме при входе в систему (с помощью Ctrl-Alt F1) или через ssh, поскольку оболочка будет отцом всего процесса, она загрузит ваш ~/.bash_profile.
  • В графическом режиме, когда вы открываете свой сеанс, первый процесс (gnome-session для классической ubuntu) будет отвечать за чтение
    .profile.

Хорошо, так куда же девать мои вещи?

Это довольно сложно, в полная история здесь. Но вот краткое изложение, которое довольно часто встречается у пользователей ubuntu. Итак, учитывая, что:

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

Это краткое предложение о том, куда положить вещи.

  • ~/.bashrc (Получает оценивается во всех случаях, при условии, что вы будете следовать рекомендации)

    Для быстрая оценка переменная среды и код для вашего только для пользователя и только для bash использование командной строки (например, псевдонимы). башизм приветствуются.

    Он загружается сам на себя после:

    • создайте новое окно/панель оболочки в графических сеансах.
    • зовущий bash
    • screen новая панель или вкладка. (не tmux !)
    • любой экземпляр bash в графическом консольном клиенте (terminator/gnome-terminal...) если вы не тикай опция "выполнить команду от имени командной оболочки входа".

    И он будет загружен во всех других случаях благодаря предварительной рекомендации.

  • ~/.bash_profile (Получает оценивается только в конкретном случае)

    Для медленная оценка переменная среды и код для вашего только для пользователя и консоль-сеанс процессы. башизм приветствуются.Он загружается на:

    • вход в консоль (Ctrl-Alt F1),
    • вход по ssh на этот компьютер,
    • tmux новая панель или окна (настройки по умолчанию), (не screen !)
    • явные призывы к bash -l,
    • любой экземпляр bash в графическом консольном клиенте (terminator/gnome-terminal...) только если вы ставите галочку напротив опции "выполнить команду от имени оболочки входа в систему".
  • ~/.профиль (Вычисляется только в графическом сеансе)

    Для медленная оценка переменные среды и с нет-башизмдля вашего только для пользователя и все графический сеанс процессы. Он загружается при входе в систему в вашем графическом интерфейсе.

Когда вы это сделаете sudo su оболочка не выполняется, вместо этого попробуйте с sudo su - это загрузит ~/.bash_profile в качестве источника по умолчанию.

Они хотят, чтобы вы поместили его в ~ /.bash_aliases прямо сейчас

в ~ /.bashrc есть этот код, указывающий на это:

# Alias definitions.# You may want to put all your additions into a separate file like# ~/.bash_aliases, instead of adding them here directly.# See /usr/share/doc/bash-doc/examples in the bash-doc package.if [ -f ~/.bash_aliases ]; then    . ~/.bash_aliasesfi