Переменные среды в bash_profile или bashrc?

Я нашел этот вопрос [блог]: Разница между .bashrc и .bash_profile очень полезна, но, увидев самый проголосовавший ответ (кстати, очень хороший), у меня есть дополнительные вопросы. В конце самого проголосовавшего, правильного ответа я вижу следующее заявление:

Обратите внимание, что вы можете видеть здесь и там рекомендации, чтобы либо устанавливать определения переменных среды в ~ / .bashrc, либо всегда запускать оболочки входа в терминалы. Оба – плохие идеи.

  1. Почему это плохая идея (я не пытаюсь бороться, я просто хочу понять)?

  2. Если я хочу установить переменную окружения и добавить ее в PATH (например, JAVA_HOME), где было бы лучше всего разместить запись экспорта? В ~ / .bash_profile или ~ / .bashrc ?

  3. Если ответ на вопрос номер 2 – ~ / .bash_profile , у меня есть еще два вопроса:

    3.1. Что бы вы поставили под ~ / .bashrc ? Только псевдонимы?

    3.2. В оболочке без входа я считаю, что файл ~ / .bash_profile не «подбирается». Если бы экспорт записи JAVA_HOME был в bash_profile, я мог бы выполнять команды javac & java ? Найдет ли они их на ПУТЕ? Это причина, по которой некоторые сообщения и форумы предлагают установить JAVA_HOME и аналогично ~ / .bashrc ?

    Заранее спасибо.

В современной системе нередко встречаются случаи, когда это имеет значение, но это происходит. (В частности, если вы используете операции оболочки в vim такие как :r !command или !<motion>command форму in-line !<motion>command .)

Что бы вы поставили под ~ / .bashrc? Только псевдонимы?

Вы помещаете вещи в ~/.bashrc , которые не будут унаследованы подсечками автоматически; Это означает псевдонимы и функции, в основном, хотя иногда у вас есть переменные настройки, которые вы не хотите видеть вне оболочки (это очень редко). Можно утверждать, что их нужно каким-то образом экспортировать, но различные экспериментальные попытки сталкиваются с проблемами совместимости с попыткой скрыть их в среде и в основном были оставлены.

Если я хочу установить переменную окружения и добавить ее в PATH (например, JAVA_HOME), где было бы лучше всего разместить запись экспорта? В ~ / .bash_profile или ~ / .bashrc?

Вы помещаете настройки среды в ~/.bash_profile чтобы им были назначены правильные начальные настройки. Иногда вы захотите их переопределить (часто это происходит в сложных средах, таких как Matlab или Cadence); Если вы установите параметры среды в ~/.bashrc тогда оболочки, запущенные из этих сред, потеряют настройки среды, и в результате все может не работать должным образом. Это также применяется, если вы используете пакет, такой как modules , virtualenv , rvm и т. Д. Для управления несколькими средами разработки; Размещение ваших настроек в ~/.bashrc означает, что вы не можете запустить среду, в которой вы хотите, из своего редактора, но вместо этого будет принудительно введен в систему по умолчанию.

В оболочке без входа я считаю, что файл ~ / .bash_profile не «подбирается».

Это верно; Вы обычно хотите, чтобы исходная оболочка была оболочкой входа в систему, и все оболочки, запущенные под ней, не были входными оболочками. Если исходная оболочка не является оболочкой входа, у вас не будет PATH умолчанию или других других параметров (включая пример JAVA_HOME ).

Большинство настольных сред, запущенных из менеджеров дисплеев (то есть подавляющее большинство графических логинов), не настраивают среду входа для всего рабочего стола, поэтому вы вынуждены запускать исходную оболочку в терминалах в качестве оболочки входа. Это вызывает ряд проблем (в частности, что PATH и такие доступные для программ, например, панели, не настроены должным образом, потому что панель не является терминалом и не запускает ~/.bash_profile ), но является разумным компромиссом, учитывая, что Не всегда возможно безопасно запускать файл ~/.bash_profile в неинтерактивной среде в начале сеанса, запускаемого диспетчером отображения, в зависимости от его содержимого. Иногда рекомендуется устанавливать настройки среды в ~/.bashrc вместо настройки оболочки входа; Как обсуждалось выше, это работает до тех пор, пока вам не нужно переопределять эту среду и вызывает нечетные поломки, когда вам это нужно.

Недавно я помог диагностировать такую ​​проблему в OS X, где пользователь, разместивший настройки в ~/.bashrc затем начал использовать rvm и perlbrew, видел нечетное поведение, потому что среды, созданные rvm двумя, были «отменены» на ~/.bashrc внутри редакторов и sudo (которые на OS X, в отличие от Linux, распространяют $HOME пользователя, так что их ~/.bashrc запускается корневой оболочкой). Прежде чем пытаться использовать эти среды, проблем не было; После того, как они начали использовать их, они были в замешательстве от неожиданной потери их настроек.

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

Проблема заключается в том, что в настоящее время мы заходим в графический интерфейс, а не через оболочку входа. В прошлом мы, пользователи unix, хотели увидеть короткий отчет о том, что происходит на сервере сразу после входа в систему, – тогда мы запустим X по командной строке – для этого отчета часто требуется некоторое время для генерации (например, 10-20 секунд). И тогда мы не хотим видеть то же самое, когда начинаем, например, xterm. Таким образом, разница.

В настоящее время я не думаю, что различие сейчас важно. Я думаю, что в эти дни, если вы используете bashrc в bash_profile, никто не может вас обвинить.

Обратите внимание, что это не относится к macos x (каждый запуск terminal.app является оболочкой входа)

Ну, о «графическом входе», это зависит от того, какой * DM вы используете …

С GDM (Gnome 3.18) у меня есть следующее:

/ и т.д. / GDM / Xsession

 #!/bin/sh <= *important* ... # First read /etc/profile and .profile test -f /etc/profile && . /etc/profile test -f "$HOME/.profile" && . "$HOME/.profile" # Second read /etc/xprofile and .xprofile for X specific setup test -f /etc/xprofile && . /etc/xprofile test -f "$HOME/.xprofile" && . "$HOME/.xprofile" и #!/bin/sh <= *important* ... # First read /etc/profile and .profile test -f /etc/profile && . /etc/profile test -f "$HOME/.profile" && . "$HOME/.profile" # Second read /etc/xprofile and .xprofile for X specific setup test -f /etc/xprofile && . /etc/xprofile test -f "$HOME/.xprofile" && . "$HOME/.xprofile" и #!/bin/sh <= *important* ... # First read /etc/profile and .profile test -f /etc/profile && . /etc/profile test -f "$HOME/.profile" && . "$HOME/.profile" # Second read /etc/xprofile and .xprofile for X specific setup test -f /etc/xprofile && . /etc/xprofile test -f "$HOME/.xprofile" && . "$HOME/.xprofile" 

Итак, ~ / .profile получает исходные данные при входе в систему с помощью / bin / sh, а не / bin / bash

Есть два случая

  1. / Bin / sh связан с / bin / bash, но работает в режиме «POSIX / Bourne»
  2. / Bin / sh is / bin / dash (debian / ubuntu). Самый быстрый, но с меньшими возможностями (поддержка ShellShock;) )

Таким образом, профиль / bin / sh – ~ / .profile, а не ~ / .bash_profile, ~ / .zprofile

Этот файл следует использовать для «агностических» параметров, таких как переменные пути и среды.

НЕТ исполняемой программы для входа в систему только для входа в систему, но здесь (проверка почты, состояние и т. Д.)

~ /.* rc предназначены только для «интерактивных» сеансов (например, псевдонимы …)

Существует разница между bash и zsh для интерактивных оболочек входа

Bash только .bash_profile, а zsh – в порядке:

  1. ~ / .zprofile
  2. ~ / .zshrc
  3. ~ / Zlogin (здесь доступны псевдонимы, определенные в ~ / .zshrc. В случае «интерактивных» + «логин» оболочек

Правильный способ сделать ~ / .bash_profile ответил здесь:

Разница между .bashrc и .bash_profile

 if [ -r ~/.profile ]; then . ~/.profile; fi case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac 

Чтобы включить проверку (и профилирование), вы можете использовать это

~ / .bash_profile:

 #!/bin/bash # ------------------------------------------------ export _DOT_BASH_PROFILE_0=`date --rfc-3339=ns` # ------------------------------------------------ if [ -f ~/.profile ] ; then . ~/.profile fi case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac # ------------------------------------------------ export _DOT_BASH_PROFILE_1=`date --rfc-3339=ns` # ------------------------------------------------ 

~ / .zprofile:

 #!/bin/zsh # ------------------------------------------------ export _DOT_ZSH_PROFILE_0=`date --rfc-3339=ns` # ------------------------------------------------ if [ -f ~/.profile ] ; then . ~/.profile fi # no need to source, zsh already handle ~/.zshrc ###case "$-" in *i*) if [ -r ~/.zshrc ]; then . ~/.zshrc; fi;; esac # ------------------------------------------------ export _DOT_ZSH_PROFILE_1=`date --rfc-3339=ns` # ------------------------------------------------ 

Затем, чтобы проверить:

 chsh -s /bin/bash ssh localhost env exit ssh localhost env ssh -t localhost bash -i -c env chsh -s /bin/zsh ssh localhost env exit ssh localhost env ssh -t localhost bash -i -c env 

Поэтому RVM / virtualenv должен идти в ~ / .profile, IMHO

Но это НЕ РАБОТАЕТ , иногда

Например, virualenvwrapper работает только в том случае, если оболочка Xsession является «исходным» bash (экспортирует BASH_VERSION)

Если вы находитесь в тире , переменная окружения и настройка пути работают, но определение функции virualenvwrapper не работает, потому что сценарий не совместим с POSIX.

Скрипт не дает никакой ошибки, но заканчивается без определения «workon» .

Таким образом, вы можете настроить среду под рукой в файле ~ / .profile , чтобы включить правильное выполнение python от клиента, запущенного непосредственно из X:

 export VIRTUAL_ENV="/home/mike/var/virtualenvs/myvirtualenv" export PATH="$VIRTUAL_ENV/bin:$PATH" unset PYTHON_HOME 

https://gist.github.com/datagrok/2199506

https://www.bountysource.com/issues/9061991-setting-up-your-computer-virtualenvwrapper-linux-all

Но для virualenvwrapper у вас есть две альтернативы:

  1. Введите его в ~ / .bash_profile или ~ / .zprofile (или ~ / .zlogin), когда терминал действует как оболочка входа
  2. Включить скрипт в ~ / .bashrc или ~ / zshrc

Это означает, что X-клиенты (например, emacs) должны запускаться из оболочки терминала, а не из графического!

«Я не могу получить никакого удовлетворения …»

  • Установка Laravel: как разместить каталог ~ / .composer / vendor / bin в вашем PATH?
  • Перепутала переменную $ PATH в Mac OS X
  • Как определить относительный путь в java (Windows)
  • Получить реальный путь от URI, Android KitKat новая система хранения данных
  • Java 7: путь к файлу
  • Как изменить папку запуска Jupyter
  • Проложить маршрут между двумя точками, используя Google Maps Android API v2
  • Файловая система TreeView
  • Возможные проблемы с добавлением / usr / local / bin к корневому пути?
  • Конкатенация строк в Less
  • Eclipse - нет Java (JRE) / (JDK) ... нет виртуальной машины
  • Interesting Posts

    Как остановить Outlook от запроса выбрать профиль?

    Результат рендеринга поврежден в Google Chrome

    Avahi: ping не может разрешить имя хоста, но nslookup может

    Поиск в Windows 10 не работает должным образом

    Почему эта программа ошибочно отвергается тремя компиляторами C ++?

    android.view.InflateException: двоичный файл XML: ошибка раздувания fragmentа classа

    Какова максимальная длина в символах, необходимых для представления любого двойного значения?

    Как преобразовать число в слова в java

    Java: String concat vs StringBuilder – оптимизирован, и что мне делать?

    Внешние блокировки жесткого диска Windows XP

    NPM не может устанавливать зависимости. Попытайтесь разблокировать что-то, что не было заблокировано.

    Как преобразовать шестнадцатеричную строку в шестнадцатеричный номер

    Какая метаинформация содержится в файле изображения?

    Экспортировать список в файл CSV или TXT в R

    Как удалить дубликаты из unsorted std :: vector, сохраняя исходный порядок с использованием алгоритмов?

    Давайте будем гением компьютера.