Почему ~/.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 и это - дополнение к ПУТИ, никогда не делались.

Решение

Я должен был перейти к ~/.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 после терминала и помещении пароля это не выполнило профиль, где я также установил упомянутый выше экспорт?
209
задан 11 April 2012 в 22:08

6 ответов

~ / .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 .

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

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

253
ответ дан 11 April 2012 в 22:08

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

перейдите в меню «Правка» -> «Настройки профиля» -> вкладка «Заголовок и команда». отметьте опцию «Выполнить команду как оболочку входа в систему» ​​

33
ответ дан 11 April 2012 в 22:08

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

shopt login_shell

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

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

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

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

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

51
ответ дан 11 April 2012 в 22:08

TL; DR

В классической рекомендуемой настройке 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 использование командной строки (псевдонимы для пример). bashism приветствуются.

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

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

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

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

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

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

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

9
ответ дан 11 April 2012 в 22:08

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

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

16
ответ дан 11 April 2012 в 22:08

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

1
ответ дан 5 January 2021 в 23:43

Другие вопросы по тегам:

Похожие вопросы: