Вопрос Почему ~ / .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-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. Сохраните изменения и выйдите

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

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

Решение

Я должен был пойти ~ / .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 или профиль в отсутствие этих двух выполняются сначала перед bashrc.
  2. В этом случае мой терминал без Логин оболочка?
  3. Если да, то почему при выполнении su после терминала и при установке пароля он не выполнял профиль, в котором я также установил экспорт, упомянутый выше?

138
2018-04-11 16:27


происхождения


Хорошее решение. Просто решил мою проблему! - Atlas7


ответы:


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

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

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

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

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

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

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


183
2018-04-11 16:41



Я обнаружил, что при открытии терминала с боковой панели в Ubuntu 12 файл ~ / .profile не загружается. - jcollum
@jcollum Это хорошо. .profile следует использовать только при входе в систему. - geirha
oh, открытие терминала - это не то же самое, что войти в систему ... Я думал о входе в систему к терминалу, - jcollum
Я знаю, поэтому я добавил туда дополнительный код. Я хотел бы настроить параметры для терминала (например, приглашение), но они не были загружены, если я их установил .profile, даже после полного перезапуска. - Juan A. Navarro
@terdon, да, но bash не участвует при входе в систему графически, поэтому он идет прямо .profile, - geirha


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

shopt login_shell

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

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

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

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

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


40
2018-04-11 16:59



Большое спасибо за shotp login_shell команда. Потрясающие!! - Viriato
Пожалуйста! Btw. в свою очередь, я многому научился из-за прокрутки страницы пользователя Bash, ища ответ. :) - lgarzo


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

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


22
2018-06-22 00:23



Простое предложение исправить проблему. Именно то, что я искал, спасибо. - Jose Torres
Каковы недостатки для включения этого параметра? - chrish
@chris вы просто загружаете код немного больше кода, чем необходимо во многих случаях. Это, вероятно, не имеет значения, если ваш ~/.bash_profile очень быстро оценивает, что, вероятно, так и есть. Хорошая вещь, чтобы проверить, - преследовать любые вызовы другим процессам, которые обычно довольно дороги. - vaab


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

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


14
2018-04-11 16:43



Это то, что я сделал, и это сработало, но проверьте, что говорит парень внизу, он предлагает плохую идею поставить его в bashrc и поместить его в профиль. .... Эй, оба пути работают, спасибо большое. - Viriato


TL; DR

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

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

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

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

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

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

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

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

Это довольно сложно, полная история здесь, Но вот бег вниз это довольно распространено для пользователей ubuntu. Поэтому, учитывая, что:

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

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

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

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

    Он загружается на себя:

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

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

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

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

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

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


1
2018-03-08 03:58



В случаях, когда bash загружает файл профиля, он загружает .profile если .bash_profile не существует. - muru