Почему мой ~ / .bash_profile не работает?


35

Я использую Linux Mint. Мой логин ( cat /etc/passwd | grep myUserName) - это bash.

После того, как я запустил свое графическое окружение рабочего стола и запустил из него эмулятор терминала, я увидел, что .bash_profileон не получен (измененные exportв нем переменные среды не установлены). Но если я вхожу из текстовой консоли ( ctrl+ alt+ F1) или вручную запускаю bash -lиз эмулятора терминала, .bash_profileработает нормально.

Я ошибаюсь, когда думаю, что он .bash_profileдолжен быть получен при запуске X, и все exported-переменные должны быть доступны в терминале, запущенном из X?

PS Помещать все .bashrcи получать из этого .bash_profileне очень хорошая идея ( https://stackoverflow.com/questions/902946/ ): окружение должно быть получено только один раз.

Ответы:


39

Файл ~/.bash_profileчитается bash, когда он является оболочкой входа в систему. Это то, что вы получаете, когда вы входите в текстовом режиме.

Когда вы входите в систему под X, сценарии запуска выполняются /bin/sh. На Ubuntu и Mint, /bin/shэто тире , а не Bash. Dash и bash оба имеют одинаковые основные функции, но dash придерживается этих основных функций для того, чтобы быть быстрым и небольшим, тогда как bash добавляет множество функций за счет необходимости большего количества ресурсов. Обычно для сценариев, которые не нуждаются в дополнительных функциях, используется dash, а для интерактивного использования bash (хотя zsh обладает множеством более приятных функций ).

Большинство комбинаций менеджера дисплея (программа , где вы вводите имя пользователя и пароль) и окружение рабочего стола читать ~/.profileиз сценариев входа в /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionили в зависимости от того применимо. Поэтому поместите определения переменных вашей среды в ~/.profile. Убедитесь, что вы используете только тот синтаксис, который поддерживает dash.

Так что вы должны положить куда?

  • Хорошо .bash_profileзагружается .profileи загружается, .bashrcесли оболочка является интерактивной.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • В .profile, поместите определения переменных среды и другие параметры сеанса, такие как ulimit.

  • В .bashrc, положить Баш интерактивные настройки , таким как псевдонимы, функция завершение, привязки клавиша (которые не находятся в .inputrc), ...

См. Также Разница между Оболочкой входа в систему и Оболочкой без регистрации? и альтернатива .bashrc .


1
многие вещи узнали из одного ответа :)
MTK

16

.bash_profileскрипт запуска конфигурации bash Не существует стандартного поручения X источнику .bash_profile.

То, о чем вы думаете, довольно .profile . Первоначально это был файл конфигурации запуска оболочки Bourne (sh). Сегодня во многих дистрибутивах среда рабочего стола настроена на исходный код .profile. Обратите внимание, что это тоже не стандарт, но, похоже, это соглашение.

Debian раньше использовал для .profileвхода в систему при графическом входе в систему ( страница вики по состоянию на 2013 год ), но теперь его нет вики-страница на 2016 год ).

Архивные источники .xprofileпри графическом входе в систему ( страница вики от 2013 года ).

Ubuntu раньше не поощрял использование .profile( страница вики с 2013 года ), теперь он больше не препятствует ( страница вики с 2016 года) ).


Относительно вашего другого вопроса: почему мой ~ / .bash_profile не работает? Это ожидаемое поведение.

Короче говоря, поведение выглядит следующим образом:

  • bash запускается как интерактивная оболочка входа в систему: читает ~/.profile
  • bash запускается как интерактивная оболочка без входа в систему: читает ~/.bashrc

Для получения более подробной информации смотрите мой ответ на аналогичный вопрос в askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319


1
Частично это правильно, но «всегда читать ~/.bashrc» - плохой совет: читать.bashrc следует только из интерактивной оболочки . Здесь вы упустили основную проблему, заключающуюся в том, что при входе в систему под X нет экземпляра входа bash (при большинстве комбинаций диспетчера отображения и среды рабочего стола, включая, очевидно, AntonioK).
Жиль "ТАК - перестань быть злым"

Спасибо за ваш отзыв. Я надеюсь, что обновил свой ответ достаточно хорошо, чтобы разрешить ваши жалобы. Что касается моего совета «всегда читать .bashrc», я всегда имел в виду интерактивную оболочку. Я уточнил эту часть. Я надеюсь, что это больше не вводит в заблуждение.
Lesmana

2
« Ubuntu специально не рекомендует использовать .profile( ссылка ) » Вики однажды (нелепо) обескуражили это; это было исправлено. (Примечание /etc/profileне рекомендуется для общесистемных назначений, предпочтительнее добавлять сценарии для них /etc/profile.d.) .profileФайлы для каждого пользователя теперь представлены в качестве одного из рекомендуемых способов установки переменных среды для каждого пользователя: «Подходящие файлы для настроек переменных среды, которые должны влиять только на Конкретным пользователем (а не системой в целом) являются ~ / .pam_environment и ~ / .profile . "
Элия ​​Каган

На связанной странице о Debian указано, что Debian не читает ~/.profileдля графического входа в систему и ~/.xsessionrcдолжен использоваться вместо него.
Карора

спасибо, что заметили. страница вики была обновлена. я связался с версиями, как они были во время ответа.
Лесмана

2

В своем вопросе вы ссылаетесь на https://stackoverflow.com/questions/902946/ как рекомендацию не указывать источник, когда принятый ответ предписывает

  • Поместите мои настройки PATH в файл .profile (потому что я иногда использую другие оболочки)
  • Поместите мои псевдонимы и функции Bash в мой файл .bashrc
  • Затем используйте это [РЕДАКТИРОВАНИЕ: снип-код-комментарии]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Помещение всего .profileэтого не работало для меня на Linux Mint. Использование .bashrcработало нормально.


2

При попытке перезагрузить файл / source ~ / .profile возникает пара проблем. [Это относится к Ubuntu Linux - в некоторых случаях детали команд будут другими]

  1. Вы запускаете это прямо в терминале или в сценарии?
  2. Как вы запускаете это в сценарии?

Объявление. 1)

Выполнение этого непосредственно в терминале означает, что не будет создано подоболочки. Таким образом, вы можете использовать любую из двух команд:

source ~/.bash_profile

или

. ~/.bash_profile

В обоих случаях это обновит среду с содержимым файла .profile.

Объявление 2) Вы можете запустить любой скрипт bash, позвонив

sh myscript.sh 

или

. myscript.sh

В первом случае это создаст подоболочку, которая не повлияет на переменные среды вашей системы, и они будут видны только процессу подоболочки. После завершения команды subshell ни один из экспортов и т. Д. Не будет применен. Это общая ошибка и вызывает много разработчиков, чтобы потерять много времени.

Чтобы ваши изменения, примененные в вашем скрипте, оказали влияние на глобальную среду, скрипт должен быть запущен с

.myscript.sh

команда.

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

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Я надеюсь, что это устраняет некоторые распространенные недоразумения! : D Удачи!


0

Простое решение - сделать терминал терминалом входа в систему. Для терминала Gnome в разделе «Плитка и команда» профиля по умолчанию вы можете установить флажок «Запускать команду как оболочку входа». В этой статье объясняется разница между оболочкой входа в систему и оболочкой, которая не является.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.