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

139

Проблема

У меня есть Ubuntu 11.04 Virtual Machine, и я хотел настроить среду разработки 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. Был ли в этом случае мой терминал a не-login оболочкой?
  3. Если да, почему при выполнении su после терминала и при установке пароля он не выполнял профиль, в котором я также установил экспорт, упомянутый выше?
задан Viriato 11.04.2012 в 18:27
источник

5 ответов

186

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

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

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

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

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

Подробнее см. DotFiles для более подробного объяснения, включая некоторую историю того, почему это так.

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

    
ответ дан geirha 11.04.2012 в 18:41
источник
40

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

shopt login_shell

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

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

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

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

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

    
ответ дан lgarzo 11.04.2012 в 18:59
22

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

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

    
ответ дан kisoku 22.06.2013 в 02:23
14

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

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

    
ответ дан Florian Diesch 11.04.2012 в 18:43
1

TL; DR

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

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

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

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

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

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

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

Хорошо, так где разместить мои вещи?

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

  • вы используете bash shell,
  • у вас есть ~/.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 (Получает оценку только в графическом сеансе)

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

ответ дан vaab 08.03.2018 в 04:58