Чому ~ / .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 після терміналу та введення пароля, він не виконував профіль, де я також встановив згаданий вище експорт?

Відповіді:


223

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

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

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

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

Шукання ~/.bash_profileз ~/.bashrc- це неправильне рішення. Це повинно бути навпаки; ~/.bash_profileповинен джерело ~/.bashrc.

Дивіться DotFiles для більш ретельного пояснення, включаючи деяку історію, чому він такий.

(Зі сторони, під час встановлення openjdk через apt, пакет повинен встановлювати посилання, щоб вам не потрібно було встановлювати JAVA_HOMEчи змінювати PATH)


6
Я виявив, що при відкритті терміналу з бічної панелі в Ubuntu 12 файл ~ / .profile не завантажується.
jcollum

3
@jcollum Це добре. .profileПотрібно знайти лише під час входу.
geirha

2
о, відкриття терміналу - це не те саме, що вхід у систему ... Я думав увійти в термінал .
jcollum

2
Майте на увазі, що .profilebash ігнорується, якщо .bash_profileтака є. Дивіться мою відповідь тут та man bashдля отримання більш детальної інформації.
terdon

3
@terdon, так, але bash не бере участь при графічному вході в систему, тому він іде прямо .profile.
geirha

48

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

shopt login_shell

Якщо у відповідь offви не використовуєте оболонку входу.

Прочитайте розділ виклику керівництва Bash про те, як Bash читає (чи не читає) різні файли конфігурації.

Витяг з man bash:

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

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


9
Дякую за команду shotp login_shell . Дивовижно !!
Віріато

27

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

перейдіть у меню Правка -> Налаштування профілю -> На вкладці Назва та Команда, перевірте опцію "Запустити команду як оболонку входу"


1
Які недоліки дозволяють увімкнути цей параметр?
Кріш

2
@chris ви просто завантажуєте код трохи більше коду, ніж потрібно в багатьох випадках. Це, мабуть, не має значення, чи ваша ~/.bash_profileоцінка дійсно швидко, що, мабуть, так і є. Хороша річ, щоб перевірити - це виганяти будь-які дзвінки в інші процеси, які зазвичай є досить дорогими.
vaab

14

Якщо ви відкриєте термінал або запустите suоболонку, вона не виконується як оболонка для входу, а як звичайна інтерактивна оболонка. Так воно читається, ~/.bashrcале ні ~/.bash_profile. Ви можете запустити suз -lможливістю змусити його запускати оболонку як оболонку для входу.

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


1
Це те, що я зробив, і це спрацювало, але перевірте, що каже хлопець внизу, він вважає, що це погана ідея помістити його в bashrc і поставити його на профіль замість цього. .... Гей, обидва способи працюють, спасибі велике.
Віріато

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- командному рядку (наприклад, псевдоніми). башизм вітається.

    Він завантажується на себе:

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

    І він буде завантажений у всіх інших випадках завдяки попередній рекомендації.

  • ~ / .bash_profile (Отримує оцінку лише в конкретних випадках )

    Для змінної та коду середовища повільної оцінки для ваших процесів, призначених лише для користувача та консолі . башизм вітається. Він завантажується на:

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

    Для змінних середовищ із повільною оцінкою та без башизму для вашого користувача та всіх процесів графічної сесії . Він завантажується після входу у ваш графічний інтерфейс користувача.


У випадках, коли bash завантажує файл профілю, він завантажується, .profileякщо .bash_profileйого не існує.
муру

Дуже дякую за чітке пояснення. це допомагає новачкам, як я. У Mac Mojave, якщо я розміщую змінні в ~ / .bashrc і виконую джерело, а потім, якщо я envне бачу встановлених змінних env (я спробував закрити iTerm та повторно відкрити). Але я помічаю, що коли я встановив студію Android та інші додатки, усі ці середовищі були налаштовані /.bash_profile. Тож коли я додав у /.bash_profileнього, працював як шарм. Чому так?
sofs1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.