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

5 ответов

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

176
ответ дан 25 May 2018 в 12:47
  • 1
    Я обнаружил, что при открытии терминала с боковой панели в Ubuntu 12 файл ~ / .profile не загружается. – jcollum 24 March 2013 в 23:20
  • 2
    @jcollum Это хорошо. .profile следует использовать только при входе в систему. – geirha 30 March 2013 в 12:59
  • 3
    oh, открытие терминала не такое же, как вход в систему ... Я думал войти в на терминал . – jcollum 31 March 2013 в 21:53
  • 4
    Я знаю, поэтому я добавил туда дополнительный код. Я хотел бы настроить параметры терминала (например, приглашение), но они не были загружены, если я установил их на .profile даже после полного перезапуска. – Juan A. Navarro 5 July 2013 в 01:02
  • 5
    @terdon, да, но bash не участвует при записи в графическом виде, поэтому он идет прямо на .profile. – geirha 11 March 2014 в 14:44

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

shopt login_shell

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

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

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

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

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

40
ответ дан 25 May 2018 в 12:47
  • 1
    Большое спасибо за команду shotp login_shell . Потрясающие!! – Viriato 11 April 2012 в 23:26
  • 2
    Пожалуйста! Btw. в свою очередь, я многому научился из-за прокрутки страницы пользователя Bash, ища ответ. :) – lgarzo 11 April 2012 в 23:31

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

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

22
ответ дан 25 May 2018 в 12:47
  • 1
    Простое предложение исправить проблему. Именно то, что я искал, спасибо. – Jose Torres 5 September 2017 в 13:56
  • 2
    Каковы недостатки для включения этого параметра? – chrish 15 November 2017 в 18:30
  • 3
    @chris вы просто загружаете код немного больше кода, чем необходимо во многих случаях. Вероятно, не имеет значения, действительно ли ваш ~/.bash_profile оценивается очень быстро, что, вероятно, так и есть. Хорошая вещь, чтобы проверить, - преследовать любые вызовы другим процессам, которые обычно довольно дороги. – vaab 8 March 2018 в 08:08

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

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

12
ответ дан 25 May 2018 в 12:47
  • 1
    Это то, что я сделал, и это сработало, но проверьте, что говорит парень внизу, он предлагает плохую идею поставить его в bashrc и поместить его в профиль. .... Эй, оба пути работают, спасибо большое. – Viriato 11 April 2012 в 23:25

TL; DR

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

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

TL; DR

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

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

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

все процессы в Linux имеют и используют переменные среды В графическом режиме, когда вы открываете сеанс, первый процесс (gnome-session для классического ubuntu) будет отвечать за чтение .profile.

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

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

В графическом режиме, когда вы открываете сеанс, первый процесс (gnome-session для классического ubuntu) будет отвечать за чтение .profile. переменные среды наследуются

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

~ / .bashrc (Получает оценку во всех случаях, если вы следуете рекомендация). Для переменной среды и кода для быстрой оценки для вашего пользовательского использования и использования только командной строки bash (например, псевдонимы). багизм приветствуется. Он загружается на себя: создайте новое окно / панель оболочки в графических сеансах. вызывая bash screen новую панель или вкладку. (не tmux!) любой экземпляр bash в графическом клиенте консоли (terminator / gnome-terminal ...), если вы не отметили опцию «запустить команду в качестве оболочки входа». И он будет загружен во всех других случаях благодаря предыдущей рекомендации. ~ / .bash_profile (Получает оценку только в конкретном случае) Для переменной и кода среды с низкой оценкой для процессов только для пользователя и консоли. багизм приветствуется. Он загружается: вход в консоль (Ctrl-Alt F1), ssh для входа на этот компьютер, tmux новое окно или окна (настройки по умолчанию), (не screen!) Явные вызовы bash -l, любой пример bash в графический клиент консоли (terminator / gnome-terminal ...), только если вы отметите опцию «запустить команду в качестве оболочки входа». , поэтому их установка на отца всего вашего процесса достаточно (особенно если для этого требуется некоторое время вычисления.)
0
ответ дан 25 May 2018 в 12:47
  • 1
    В случаях, когда bash загружает файл профиля, он загружает .profile, если .bash_profile не существует. – muru 8 March 2018 в 08:05

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

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