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

175

проблема

У меня есть виртуальная машина 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 после терминала и введении пароля он не выполнял профиль, где я также установил экспорт, упомянутый выше?
Viriato
источник

Ответы:

224

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

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

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

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

Источники ~/.bash_profileиз ~/.bashrcнеправильного решения. Это должно быть наоборот; ~/.bash_profileдолжен источник ~/.bashrc.

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

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

geirha
источник
6
Я обнаружил, что при открытии терминала с боковой панели в Ubuntu 12 файл ~ / .profile не загружается.
Jcollum
3
@jcollum Это хорошо. .profileдолжны быть получены только при входе в систему.
Geirha
2
о, открытие терминала - это не то же самое, что вход в систему ... Я думал, входя в терминал .
Jcollum
2
Имейте в виду, что .profilebash игнорирует их, если .bash_profileсуществует. Смотрите мой ответ здесь и man bashдля более подробной информации.
Тердон
3
@terdon, да, но bash не участвует при графическом входе в систему, так что все идет прямо .profile.
Гейра
48

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

shopt login_shell

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

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

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

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

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

lgarzo
источник
9
Большое спасибо за команду shotp login_shell . Потрясающие!!
Viriato
27

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

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

kisoku
источник
1
Каковы недостатки для включения этого параметра?
Пятница,
2
@ Крис, вы просто загружаете код немного больше кода, чем необходимо в большинстве случаев. Это, вероятно, не имеет значения, если вы ~/.bash_profileоцениваете очень быстро, что, вероятно, имеет место. Хорошая вещь, чтобы проверить, состоит в том, чтобы преследовать любые вызовы другим процессам, которые обычно довольно дороги.
Вааб
14

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

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

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

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 ( оценивается во всех случаях , если вы следуете рекомендации)

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

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

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

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

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

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

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

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

vaab
источник
В случаях, когда bash загружает файл профиля, он загружается, .profileесли .bash_profileон не существует.
Муру
Большое спасибо за четкое объяснение. это помогает новичкам, как я. В Mac Mojave, если я помещаю переменные в ~ / .bashrc и делаю source, а затем, если я делаю, envя не вижу установленных переменных env (я пытался закрыть iTerm и снова открыть). Но я заметил, что когда я установил Android studio и другие приложения, все эти env vars были включены /.bash_profile. Поэтому, когда я добавил в /.bash_profileнего, работал как шарм. Почему это?
sofs1