Установка переменных среды в OS X

850

Как правильно изменить переменные среды, такие как PATH в OS X?

Я немного заглянул в Google и нашел три разных файла для редактирования:

  • / и т.д. / дорожки
  • ~ / .Profile
  • ~ / .Tcshrc

У меня даже нет некоторых из этих файлов, и я уверен, что .tcshrc не так, так как OS X теперь использует bash. Где эти переменные, особенно PATH, определены?

Я использую OS X v10.5 (Leopard).

Пол Уикс
источник
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/запустить приложение с графическим интерфейсом с новой установленной системной средой.
Гонконг,
Смотрите также: stackoverflow.com/questions/25385934/…
ThomasR

Ответы:

653

Бруно на верном пути. Я провел обширные исследования, и если вы хотите установить переменные, которые доступны во всех приложениях с графическим интерфейсом, ваш единственный вариант /etc/launchd.conf.

Обратите внимание, что environment.plist не работает для приложений, запущенных через Spotlight. Это задокументировано Стивом Секстоном здесь .

  1. Откройте окно терминала

  2. Тип sudo vi /etc/launchd.conf(примечание: этот файл может еще не существовать)

  3. Поместите в файл следующее содержимое

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
  4. Сохраните изменения в vi и перезагрузите Mac. Или используйте команду grep/, xargsкоторая показана в комментарии к коду выше.

  5. Докажите, что ваши переменные работают, открыв окно терминала и набрав, exportи вы должны увидеть новые переменные. Они также будут доступны в IntelliJ IDEA и других приложениях с графическим интерфейсом, которые вы запускаете через Spotlight.

Мэтью Маккалоу
источник
3
Я говорю, что принятый ответ (environment.plist) не был успешным для меня. Я успешно использовал подход launchd.conf на 10.5 и 10.6 на четырех машинах.
Мэтью Маккалоу
54
Есть ли способ сделать это без делать перезагрузку системы ?
сорин
40
Упомянутое выше ограничение относится к MacOS X 10.5. Однако MacOS X 10.6 больше не имеет этого ограничения, и установка значений в environment.plist работает даже для приложений, запущенных через spotlight. Таким образом, выбранный ответ является правильным для Snow Leopard ;-)
Луи Жакомет
5
Установка launchd.confодносторонняя, но требует перезагрузки (для перезапуска launchd). Если вы хотите избежать перезагрузки, см. Мой ответ stackoverflow.com/questions/135688/…
Мэтт Кертис
23
Есть несколько проблем с представленным подходом запуска. Большинство из них относятся к переменной окружения PATH, но спрашивающий действительно упомянул PATH. 1) элементы в файле launchd.conf не применяются в интерактивных оболочках, таких как ssh, в систему. 2) наличие строки «setenv PATH / testdir» добавляет к PATH в Terminal.app, но удаляет все остальные элементы PATH в средах приложений OS X. 3) Выполнение «setenv PATH $ {PATH}: / testdir» в /etc/launchd.conf неправильно расширяет существующий $ PATH 4) launchd.conf применяется ко всем пользователям, а не только к одному. Не то чтобы я был лучше, чем солнце.
NoahR
257

Как настроить среду для новых процессов, запускаемых Spotlight (без перезагрузки)

Вы можете установить среду, используемую launchd (и, как следствие, все, что запускается из Spotlight) с помощью launchctl setenv. Например, чтобы установить путь:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Или, если вы хотите настроить свой путь .bashrcили аналогичный, то отразите его в launchd:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Нет необходимости перезагружаться, хотя вам нужно будет перезапустить приложение, если вы хотите, чтобы оно приняло измененную среду.

Это включает в себя все оболочки, уже запущенные в Terminal.app, хотя, если вы там, вы можете установить среду более напрямую, например, с помощью export PATH=/opt/local/bin:/opt/local/sbin:$PATHbash или zsh.

Как сохранить изменения после перезагрузки

Чтобы сохранить изменения после перезагрузки, вы можете установить переменные окружения /etc/launchd.conf, например, так:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf выполняется автоматически при перезагрузке.

Если вы хотите, чтобы эти изменения вступили в силу сейчас, вы должны использовать эту команду для повторной обработки launchctl.conf(спасибо @mklement за подсказку!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Вы можете узнать больше о launchctlтом, как он загружается, launchd.confс помощью команды man launchctl.

Мэтт Кертис
источник
2
Очень хороший! Преимущество использования environment.plist, однако, заключается в том, что OS X соблюдает содержимое этих файлов без необходимости запуска терминала в первую очередь. В любом случае, я думаю, что ваш ответ в основном сосредоточен на том, чтобы избежать необходимости перезагрузки, так что спасибо за это.
Фотнелтон
2
@kapuzineralex Да, это предотвращает перезагрузку, а также изменяет среду для программ, запущенных из Spotlight, чего environment.plistне происходит.
Мэтт Кертис
2
Настройка среды таким образом работала для меня только до перезагрузки. Переменная среды не длилась после того, как я перезагрузил Mac. Ответ Мэтью отлично сработал для меня.
Шамаль Карунаратне
8
@Shamal: Я добавил +1 к вашему комментарию, но имейте в виду, что ответ Мэтью требует перезагрузки, в то время как я указываю правильный способ изменить его без перезагрузки. Если вы хотите и то, и другое, я предлагаю вам указать настройки пути в файле launchd.conf (чтобы они сохранялись при перезагрузках), а затем использовать скрипт с чем-то вроде этого «source /etc/launchctl.conf; launchctl setenv PATH $ PATH», поэтому Вы также можете «обновить», когда не хотите перезагружаться.
Мэтт Кертис
5
@MattCurtis Не могли бы вы отредактировать свой ответ напрямую, чтобы было ясно, что, хотя перезагрузка не требуется, изменения фактически будут потеряны после перезагрузки? Кроме того , правильный способ применить изменения etc/launchd.confперед тем, как перезагрузка будет использовать подход @ ответ MatthewMcCullough в: egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl.
mklement0
106

До OS X v10.7 включительно (Lion) вы можете установить их в:

~/.MacOSX/environment.plist

Видеть:

Для PATH в Терминале вы должны быть в состоянии установить .bash_profileили .profile(возможно, вам придется создать его)

Для OS X v10.8 (Mountain Lion) и выше вам нужно использовать launchdиlaunchctl .

tim_yates
источник
4
Это только если вы действительно ожидаете, что они будут использоваться графическими приложениями. Поскольку они обычно не используют переменные окружения, их не очень удобно устанавливать.
Крис Хэнсон
18
Есть несколько очень хороших примеров графических приложений, которые используют переменные среды. Например, IntelliJ любит видеть M2_HOME, чтобы знать, где живет Maven. Чтобы увидеть переменную, вам нужно установить ее в /etc/launchd.conf вместо environment.plist.
Мэтью Маккалоу
3
Для справки: использование preferences.plistбыло менее чем идеальным с OS X 10.5, так как в то время preferences.plistне было прочитано для приложений, запущенных через центр внимания, см. Комментарий Луи к ответу Мэтью и email.esm.psu.edu/pipermail/macosx-emacs/2010-May /002113.html . Для OS X 10.6 environment.plistработает так же, как и должно.
Янус
16
Это больше не применимо к OSX 10.8 apple.stackexchange.com/questions/57385/…
произойдет
1
@tim_yates Не могли бы вы отредактировать первую строку вашего ответа, чтобы прочитать «До Льва и включая его (10. * 7 *)», учитывая, что это правильно? Я попытался сделать это редактирование к оригинальному, неоднозначному "До Горного Льва", и рецензенты испортили это.
mklement0
67

Решение как для командной строки, так и для приложений с графическим интерфейсом из одного источника (работает с Mac OS X 10.10 (Yosemite) и Mac OS X 10.11 (El Capitan))

Предположим, у вас есть определения переменных среды в вашем ~/.bash_profileподобии в следующем фрагменте:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

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

Создайте файл с plistсуффиксом (например, named osx-env-sync.plist) в ~/Library/LaunchAgents/каталоге со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-lпараметр является критическим здесь; это необходимо для выполнения сценария оболочки с оболочкой входа в систему, чтобы~/.bash_profile он был получен в первую очередь перед выполнением этого сценария.

Теперь скрипт оболочки. Создайте его ~/.osx-env-sync.shсо следующим содержимым:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

Убедитесь, что скрипт оболочки является исполняемым:

chmod +x ~/.osx-env-sync.sh

Теперь загрузите агент запуска для текущего сеанса:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Пере) Запустите приложение с графическим интерфейсом и убедитесь, что оно может читать переменные среды.

Настройка постоянна. Он выживет, перезапустится и войдет.

После первоначальной настройки (которую вы только что сделали), если вы хотите снова отразить какие-либо изменения в ~/.bash_profileвашей среде, повторный запуск launchctl load ...команды не будет выполнять то, что вы хотите; вместо этого вы получите предупреждение, подобное следующему:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

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

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Наконец, убедитесь, что вы перезапускаете уже работающие приложения (включая Terminal.app), чтобы они знали об изменениях.

Я также поместил здесь код и пояснения в проект GitHub: osx-env-sync .

Я надеюсь, что это будет окончательное решение, по крайней мере, для последних версий OS X (Yosemite & El Capitan).

Эрсин Эр
источник
Работает красиво. Немного беспокоюсь, если это станет популярным, если это будет лазейка в безопасности
Уоррен П
3
Это решение было единственным, которое я смог заставить работать должным образом. Великолепные решения. Я не могу понять, почему это должно быть так сложно для Mac ...
JohnyTex
2
К сожалению, на Эль-Капитане это не работает. Ваш комментарий от github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 хорошо объясняет проблему.
мгол
1
Таким образом, это решение не работает, /etc/launchd.conf не имеет никакого эффекта, Node.js устанавливает свой двоичный файл в / usr / local / bin, и этот путь отсутствует в PATH для приложений с графическим интерфейсом. Следовательно, перехватчики Git с использованием Node вообще не работают в приложениях Git с графическим интерфейсом, таких как SourceTree, в El Capitan. Это ужасно.
mgol
1
Проблема только в переменной PATH. Я надеюсь, что мы сможем найти решение в ближайшее время.
Эрсин Эр
54
  1. Делать:

    vim ~/.bash_profile

    Файл может не существовать (если нет, вы можете просто создать его).

  2. Введите это и сохраните файл:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Запустить

    source ~/.bash_profile
WoooHaaaa
источник
+1 export- это то, что я собирался предложить, поскольку BASH не поддерживаетsetenv
vol7ron
Работает на данный момент. Все это выглядит намного сложнее, чем я думал. Придется посвятить еще немного времени всем этим позже. Спасибо.
Руто Коллинз
34

Существуют две проблемы, которые необходимо решить при работе с переменными среды в OS X. Первая - при вызове программ из Spotlight (значок увеличительного стекла в правой части меню / строки состояния Mac), а вторая - при вызове программ из Dock. , Вызов программ из приложения / утилиты терминала тривиален, поскольку он считывает среду из стандартных расположений оболочки (~/.profile , ~/.bash_profile, ~/.bashrcи т.д.)

При вызове программ из Dock используйте, ~/.MacOSX/environment.plist где <dict>элемент содержит последовательность <key>KEY</key><string>theValue</string>элементов.

При вызове программ из Spotlight убедитесь, что launchd настроен со всеми необходимыми настройками ключ / значение.

Чтобы решить обе проблемы одновременно, я использую элемент входа (установленный с помощью инструмента «Системные настройки») в моей учетной записи пользователя. Элемент входа в систему представляет собой bash-скрипт, который вызывает функцию lisp Emacs, хотя, конечно, можно использовать их любимый инструмент для написания сценариев, чтобы выполнить то же самое. Этот подход имеет дополнительное преимущество, заключающееся в том, что он работает в любое время и не требует перезагрузки, т. Е. Можно редактировать ~/.profile, запускать элемент входа в систему в некоторой оболочке и видеть изменения для вновь запускаемых программ из Dock или Spotlight.

Подробности:

Элемент входа: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Функция Emacs lisp: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

ПРИМЕЧАНИЕ. Это решение представляет собой объединение тех, кто пришел до того, как я добавил свое, в частности, предложенное Мэттом Кертисом, но я намеренно пытался сохранить ~/.bash_profileнезависимость своей платформы контента и перенести настройку launchdсреды (средство только для Mac) в отдельный скрипт. ,

pajato0
источник
20
Ух ты. Я не говорю, что это не сработает, но ... Я просто потрясен сложностью, необходимой для создания согласованной среды на OS X.
offby1
2
Это работает лучше всего из всех решений, которые я видел для 10.9. Единственный недостаток заключается в том, что, поскольку элементы входа в систему запускаются в неопределенном порядке, если Emacs (например) запускается при входе в систему (например, потому что он был открыт при выходе из системы), он не обязательно будет иметь переменные среды, если вы не перезапустите его. потому что он запускается до того, как ваш скрипт.
Телоториум
22

Другим бесплатным открытым исходным кодом Mac OS X v10.8 (Mountain Lion) Pane / environment.plist Preference является EnvPane .

Исходный код EnvPane доступен на GitHub . EnvPane выглядит она имеет сопоставимые функции в RCEnvironment , однако, кажется , что это может обновить свои сохраненные переменные мгновенно, т.е. без необходимости перезапуска или входа в систему, что приветствуется.

Как заявлено разработчиком:

EnvPane - это панель настроек для Mac OS X 10.8 (Mountain Lion), которая позволяет вам устанавливать переменные среды для всех программ как в графическом, так и в терминальном сеансах. Он не только восстанавливает поддержку ~ / .MacOSX / environment.plist в Mountain Lion, но и немедленно публикует ваши изменения в среде без необходимости выхода и повторного входа. <SNIP> EnvPane включает (и автоматически устанавливает) a Агент launchd, который запускается 1) рано после входа в систему и 2) всякий раз, когда изменяется ~ / .MacOSX / environment.plist. Агент читает ~ / .MacOSX / environment.plist и экспортирует переменные среды из этого файла в экземпляр launchd текущего пользователя через тот же API, который используется launchctl setenv и launchctl unsetenv.

Отказ от ответственности: я никоим образом не связан с разработчиком или его / ее проектом.

PS Мне нравится название (звучит как 'Ends Pain').

Большой Богатый
источник
2
EnvPane не может установить PATH в данный момент. Для получения более подробной информации см. Мой отчет об ошибке: github.com/hschmidt/EnvPane/issues/5
Уве Гюнтер
Я ️ ️ это вещь ... Единственный недостаток ... который я думаю, что ЛЮБОЕ решение будет жертвой ... это - необходимость перезапустить процесс - чтобы унаследовать новую "среду". Вонк Вонк.
Алекс Грей,
2
@sorin: Можете ли вы открыть проблему на сайте GitHub с описанием проблемы, с которой вы столкнулись? EnvPane работает для меня 10.10. Отказ от ответственности: я автор EnvPane.
Ханнес
17

Обновление (2017-08-04)

Начиная с (по крайней мере) macOS 10.12.6 (Sierra) этот метод, похоже, перестал работать для Apache httpd (как systemдля userопции, так и для опцииlaunchctl config ). Другие программы, похоже, не пострадали. Вполне возможно, что это ошибка в httpd.

Оригинальный ответ

Это касается OS X 10.10+ (10.11+, в частности, из-за режима без root, где /usr/bin без больше нет возможности записи).

Я читал в нескольких местах, что использование launchctl setenv PATH <new path>для установки PATHпеременной не работает из-за ошибки в OS X (которая кажется верной из личного опыта). Я обнаружил, что PATHдля приложений, не запускаемых из оболочки, можно установить другой способ :

sudo launchctl config user path <new path>

Эта опция задокументирована на странице руководства launchctl:

система конфигурации | значение параметра пользователя

Устанавливает постоянную информацию о конфигурации для доменов launchd (8). Только системный домен и пользовательские домены могут быть настроены. Расположение постоянного хранилища является деталью реализации, и изменения в этом хранилище следует вносить только с помощью этой подкоманды. Чтобы изменения вступили в силу с помощью этой подкоманды, требуется перезагрузка.

[...]

дорожка

Устанавливает строковое значение для переменной среды PATH для всех служб в целевом домене. Строковое значение должно соответствовать формату, указанному для переменной среды PATH в Environment (7). Обратите внимание, что если служба указывает свой собственный PATH, переменная среды для службы будет иметь приоритет.

ПРИМЕЧАНИЕ. Это средство нельзя использовать для установки общих переменных среды для всех служб в домене. Он намеренно ограничен переменной среды PATH и ничем иным из соображений безопасности.

Я подтвердил это для работы с приложением с графическим интерфейсом, запущенным из Finder (который использует getenvдля получения PATH). Обратите внимание, что вы должны сделать это только один раз, и изменения будут сохраняться после перезагрузки.

Макс Леске
источник
У меня это тоже работает. sudo launchctl procinfo <gui-pid>показывает новую установленную PATHсреду. Но на sudo launchctl config user path <new path>самом деле установлено для всех пользователей ... (подтверждается добавлением нового пользователя и использованием консоли Python Sublime Text)
Bossliaw
1
Похоже, это не влияет на переменную среды PATH приложений, которые открываются при входе в систему (которые были открыты при завершении работы).
Брехт Мачиэльс
Интересно. Это будет означать, что для приложений, которые будут вновь открыты, среда (или ее подмножество) сохраняется.
Макс Леске
@MaxLeske Нет, вновь открытые приложения запускаются до изменения переменной среды. Так что это происходит не только в первый раз после sudo launchctl config user pathэтого (что вы, похоже, предполагаете?).
Брехт Мачиэльс
1
@ShlomiSchwartz launchctlникак не позволяет установить произвольные переменные окружения. PATHПеременная является исключением.
Макс Леске
17

На Mountain Lion все /etc/pathsи /etc/launchd.confредактирование не дает никакого эффекта!

Форумы разработчиков Apple говорят:

Msgstr "Измените Info.plist самого .app, чтобы он содержал словарь" LSEnvironment "с необходимыми переменными среды.

~ / .MacOSX / environment.plist больше не поддерживается. "

Поэтому я непосредственно отредактировал приложение Info.plist(щелкните правой кнопкой мыши «AppName.app» (в данном случае SourceTree), а затем « Show package contents»).

Показать содержимое пакета

И я добавил новую пару ключ / dict:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(см .: Документация по LaunchServicesKeys в Apple )

Введите описание изображения здесь

Теперь приложение (в моем случае Sourcetree) использует указанный путь и работает с Git 1.9.3 :-)

PS: Конечно, вы должны настроить запись пути в соответствии с вашими потребностями.

Флори
источник
3
Это решение соответствует стандарту наименее навязчивых в системе. Спасибо.
Джон Вэнс
@John Vance +1 Полностью согласен, общесистемные изменения всегда рискованны, как ясно объясняет Джейсон Т. Миллер в своем ответе
rmcsharry
5
Это не влияет на меня в Эль-Капитане. :(
mgol
На High Sierra 10.13, если я Info.plistLSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
изменяю
16

Хотя ответы здесь не являются «неправильными», я добавлю еще один: никогда не вносите изменения переменных среды в OS X, которые влияют на «все процессы» или даже вне оболочки, для всех процессов, выполняемых в интерактивном режиме данным пользователем.

По моему опыту, глобальные изменения переменных среды, таких как PATH для всех процессов, с большей вероятностью могут сломать вещи в OS X, чем в Windows. Причиной этого является то, что многие приложения OS X и другое программное обеспечение (включая, возможно, особенно компоненты самой ОС) полагаются на инструменты командной строки UNIX изнутри и принимают на себя поведение версий этих инструментов, поставляемых с системой, и при этом не обязательно использовать абсолютные пути (аналогичные комментарии применяются к динамически загружаемым библиотекам и переменным окружения DYLD_ *). Предположим, например, что ответы с самыми высокими оценками на различные вопросы переполнения стека о замене предоставленных OS X версий интерпретаторов, таких как Python и Ruby, обычно говорят «не делайте этого».

В этом отношении OS X ничем не отличается от других UNIX-подобных операционных систем (например, Linux, FreeBSD и Solaris); Наиболее вероятная причина, по которой Apple не предоставляет простой способ сделать это, заключается в том, что это ломает вещи . В той степени, в которой Windows не так подвержена этим проблемам, это связано с двумя причинами: (1) программное обеспечение Windows не склонно полагаться на инструменты командной строки, как это делает программное обеспечение UNIX, и (2) Microsoft имела такая обширная история как «ада DLL», так и проблем безопасности, вызванных изменениями, которые влияют на все процессы, что они изменили поведение динамической загрузки в более новых версиях Windows, чтобы ограничить влияние «глобальных» параметров конфигурации, таких как PATH.

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

Джейсон Т. Миллер
источник
1
Говорить людям не делать то, что они спрашивали, как делать, не является ответом на вопрос, который они задавали. Предотвращение людей от этого также ломает вещи. Способ работы Apple.
радостный
Установка PATH в /Applications/App.app/Contents/Info.plist с помощью ключа LSEnvironment developer.apple.com/library/archive/documentation/General/… может быть текущим рекомендуемым решением.
Дэйв Икс
15

Иногда все предыдущие ответы просто не работают. Если вы хотите иметь доступ к системной переменной (например M2_HOME) в Eclipse или в IntelliJ IDEA, единственное, что мне подходит в этом случае:

Сначала (шаг 1) отредактируйте так, /etc/launchd.confчтобы он содержал такую ​​строку: «значение VAR setenv», а затем (шаг 2) перезагрузите компьютер.

Простое изменение .bash_profile не будет работать, потому что в OS X приложения не запускаются, как в других Unix'ах; они не наследуют переменные оболочки родителя. Все остальные модификации не будут работать по неизвестной мне причине. Может быть, кто-то еще может прояснить это.

Бруно Раншарт
источник
5
Все приложения, запущенные из Spotlight или любым другим способом, читают /etc/launchd.conf своим родительским процессом, что делает этот выбор привлекательным для установки переменных среды, видимых во всех приложениях и оболочках.
Мэтью Маккалоу
1
Смотрите мой ответ для другого решения, которое избегает перезагрузки - stackoverflow.com/questions/135688/…
Мэтт Кертис,
На моей машине MaxOS 10.6 отсутствует файл /etc/launchd.conf. Это новая или устаревшая вещь в этой версии? Или эта машина испорчена?
peterk
13

После погони на панели настроек Переменные среды и обнаружения, что ссылка не работает, и поиск на сайте Apple, кажется, показывает, что они забыли об этом ... Я вернулся к следу неуловимого процесса запуска.

В моей системе (Mac OS X 10.6.8) кажется, что переменные, определенные в environment.plist , надежно экспортируются в приложения, запускаемые из Spotlight (с помощью launchd). Моя проблема в том, что эти переменные не экспортируются в новые сессии bash в Терминале. Т.е. у меня противоположная проблема, как здесь изображено.

ПРИМЕЧАНИЕ: environment.plist выглядит как JSON, а не XML, как описано ранее

Я смог заставить приложения Spotlight просматривать переменные, отредактировав ~ / MacOSX / environment.plist, и смог принудительно установить те же переменные в новую сессию терминала, добавив в свой файл .profile следующее:

eval $(launchctl export)
Рассел Б
источник
2
Не так неуловимо: RCenvironment
Гилиманджаро
Хороший совет по экспорту launchctl. Но я бы не стал помещать это как есть в .profile. Он заменит ваш $ PATH на тот, который не включает / usr / local / bin. Но вы можете использовать регулярное выражение для выбора интересующих вас переменных: `` eval $ (launchctl export | grep '^ my. * =').
mivk
3
На моей новой машине Mountain Lion (10.8.2) environment.plist совершенно бесполезен. Смотрите ответ Мэтью для правильного пути. Это все о запуске и приложении командной строки launchctl вместе с /etc/launchd.conf. Вы можете прочитать сами с man launchd, man launchctlи man launchd.confв окне терминала. Рад, что Apple постоянно обновляет справочные страницы, даже если библиотека разработчиков Mac немного отстает.
Рассел Б
10

Любой из баша загрузочных файлов - ~/.bashrc, ~/.bash_profile, ~/.profile. Есть также какой-то странный файл, названный ~/.MacOSX/environment.plistдля переменных среды в приложениях с графическим интерфейсом.

Джон Милликин
источник
10

Подобно ответу, который дал Мэтт Кертис, я устанавливал переменные окружения через launchctl, но я оборачивал его в функцию с именем export, так что всякий раз, когда я экспортирую переменную, как обычно, в мой .bash_profile, он также устанавливается launchctl. Вот что я делаю:

  1. Мой .bash_profile состоит только из одной строки (это просто личные предпочтения.)

    source .bashrc
  2. Мой .bashrc имеет это:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. Вышеприведенное перегрузит встроенный «экспорт» Bash и экспортирует все нормально (вы заметите, что я экспортирую «экспорт» вместе с ним!), А затем правильно установит их для сред приложений OS X через launchctl, независимо от того, используете ли вы одно из следующего:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. Таким образом, мне не нужно каждый раз отправлять каждую переменную в launchctl, и я могу просто настроить мой .bash_profile / .bashrc так, как я хочу. Откройте окно терминала, проверьте интересующие вас переменные окружения launchctl getenv myVar, измените что-нибудь в своем .bash_profile / .bashrc, закройте окно терминала и снова откройте его, проверьте переменную снова с помощью launchctl, и вуаля, она изменилась.

  5. Опять же, как и в других решениях для мира после появления Mountain Lion, для того, чтобы любые новые переменные среды были доступны для приложений, вам нужно запускать или перезапускать их после изменения.

courtlandj
источник
1
Полезный ответ - спасибо. Я просто обновил его, потому что ваше оригинальное решение не обрабатывало случаи, когда значение переменной среды, которую вы устанавливали, содержало знаки равенства (например, CXX_FLAGS = "- mmacosx-version-min = 10.9"
Стив Броберг,
@SteveBroberg - только одно изменение символа исправляет регулярное выражение Bash без необходимости использования sed! (Не поймите меня неправильно, я люблю sed, но это работает и намного короче.)
courtlandj
1
Я подумал, что должен быть лучший способ, но я не гуру от Bash, и я не мог гуглить, что такое %%, ## и т. Д.
Стив Броберг
10

Вот очень простой способ сделать то, что вы хотите. В моем случае это заставляло Gradle работать (для Android Studio).

  • Откройте Терминал.
  • Запустите следующую команду:

    sudo nano /etc/paths или sudo vim /etc/paths

  • Введите свой пароль, когда будет предложено.

  • Перейдите в конец файла и введите путь, который вы хотите добавить.
  • Нажмите Control+, Xчтобы выйти.
  • Введите «Y», чтобы сохранить измененный буфер.
  • Откройте новое окно терминала и введите:

    echo $PATH

Вы должны увидеть новый путь, добавленный в конец PATH.

Я получил эти детали из этого поста:

Добавьте в PATH на Mac OS X 10.8 Mountain Lion и выше

wired00
источник
7

Быть кратким и ясным о том, для чего предназначен каждый файл

  • ~/.profile источник каждый раз при запуске Terminal.app
  • ~/.bashrc где «традиционно» задаются все операторы экспорта для среды Bash
  • /etc/paths является основным файлом в Mac OS, который содержит список путей по умолчанию для создания переменной среды PATH для всех пользователей
  • /etc/paths.d/ содержит файлы, которые содержат дополнительные пути поиска

Нетерминальные программы не наследуют общесистемные переменные PATH и MANPATH, как ваш терминал! Чтобы установить среду для всех процессов, запускаемых конкретным пользователем, и, таким образом, сделать переменные среды доступными для приложений Mac OS X с графическим интерфейсом, эти переменные должны быть определены в вашем ~/.MacOSX/environment.plist(Apple Technical Q & A QA1067)

Используйте следующую командную строку для синхронизации environment.plistс /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"
Клаудио Флореани
источник
6

/etc/launchd.conf не используется в OS X v10.10 (Yosemite), OS X v10.11 (El Capitan), macOS v10.12 (Sierra) или macOS v10.13 (High Sierra).


Со launchctlстраницы руководства :

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Метод, описанный в этом ответе Ask Different, работает для меня (после перезагрузки): приложения, запущенные из Dock или из Spotlight, наследуют переменные среды, которые я установил ~/Library/LaunchAgents/my.startup.plist. (В моем случае, мне нужно , чтобы установить LANG, чтобы en_US.UTF-8для текстового плагин Sublime.)

Дэвид
источник
При перезагрузке существует ли порядок загрузки, обеспечивающий загрузку my.startup.plist до перезапуска приложений из последней сессии?
Канджбхай
3

Это просто:

Отредактируйте ~ / .profile и поместите ваши переменные следующим образом

$ vim ~ / .profile

В файле положить:

MY_ENV_VAR = значение

  1. Сохранить (: wq)

  2. Перезапустите терминал (выйдите и снова откройте его)

  3. Убедитесь, что все в порядке:

$ echo $ MY_ENV_VAR

$ value


Фернандо Мартинес
источник
3

Для однопользовательской модификации используйте ~/.profileперечисленные вами. Следующая ссылка объясняет, когда Bash читает различные файлы.

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

Если вы хотите установить переменную окружения для приложений графического интерфейса, вам нужен файл ~ / .MacOSX / environment.plist

mmaibaum
источник
3

Ну, я не уверен насчет /etc/pathsи~/.MacOSX/environment.plist файлов. Это новые.

Но с Bash вы должны знать, что .bashrcвыполняется с каждым новым вызовом оболочки и.bash_profile выполняется только один раз при запуске.

Я не знаю, как часто это происходит с Mac OS X. Я думаю, что различие сломалось из-за оконной системы, запускающей все.

Лично я устраняю путаницу, создавая .bashrcфайл со всем, что мне нужно, а затем делаю:

ln -s .bashrc .bash_profile
mike511
источник
3

В дополнение к предлагаемым подходам следует отметить, что, по крайней мере, в OS X 10.5 (Leopard) установленные переменные launchd.confбудут объединены с настройками, выполненными в .profile. Я полагаю, что это может быть также верно для настроек ~/.MacOSX/environment.plist, но я не проверял.

MiB
источник
3

Настройте переменную среды PATH в Mac OS

Откройте программу «Терминал» (по умолчанию она находится в папке «Программы / Утилиты»). Запустите следующую команду

touch ~/.bash_profile; open ~/.bash_profile

Это откроет файл в текстовом редакторе по умолчанию.

Для Android SDK в качестве примера:

Вам необходимо добавить путь в каталог инструментов и инструментов платформы Android SDK. В моем примере я буду использовать «/ Development / android-sdk-macosx» в качестве каталога, в котором установлен SDK. Добавьте следующую строку:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Сохраните файл и выйдите из текстового редактора. Запустите ваш .bash_profile, чтобы обновить PATH:

source ~/.bash_profile

Теперь каждый раз, когда вы открываете программу Terminal, ваш PATH будет включать Android SDK.

Хараф JRA
источник
3

Просто сделал это действительно легко и быстро. Сначала создайте ~ / .bash_profile из терминала:

touch .bash_profile

тогда

open -a TextEdit.app .bash_profile

Добавить

export TOMCAT_HOME=/Library/Tomcat/Home

сохранить документ, и все готово.

CodeOverRide
источник
Perfecto. Я выполнил шаги для JAVA_HOME, только что добавил экспорт JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contents / Home и действительно быстрый успех!
NarendraC
Отлично @NarendraC!
CodeOverRide
2

Это довольно просто. Редактировать файл .profile(vi, nano , Sublime Text или другой текстовый редактор). Вы можете найти его в ~/каталоге (каталог пользователя) и установить так:

export MY_VAR=[your value here]

Пример с домом Java:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Сохраните его и вернитесь в терминал.

Вы можете перезагрузить его с помощью:

source .profile

Или закройте и откройте окно терминала.

francois.robert
источник
2

Здесь есть два типа снарядов.

  • Без входа в систему: .bashrc перезагружается каждый раз, когда вы запускаете новую копию Bash
  • Вход в систему: .profile загружается только тогда, когда вы входите в систему или явно указываете Bash загрузить его и использовать в качестве оболочки входа.

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

Теперь, когда у вас есть базовое понимание, давайте перейдем к тому, как я бы посоветовал вам его настроить.

  • .profile: создать его несуществующим. Поместите вашу настройку PATH туда.
  • .bashrc: создать, если не существует. Поместите туда все свои псевдонимы и пользовательские методы.
  • .bash_profile: создать, если не существует. Поместите следующее там.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#
ZOXIS
источник
2

Войти Оболочки

/etc/profile

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

.bash_profile
.bash_login
.profile

Далее выглядят оболочки для ~/.bash_profile, ~/.bash_loginи ~/.profile(~ / является кратко- рука для вашей домашней директории), в указанном порядке, выполнение команд в первом из этих файлов , которые он находит. Вы можете поместить команды в один из этих файлов, чтобы переопределить значения по умолчанию, установленные в /etc/profile. Оболочка, работающая на виртуальном терминале, не выполняет команды в этих файлах.

.bash_logout

Когда вы выходите из системы, bash выполняет команды в ~/.bash_logoutфайле. Этот файл часто содержит команды, которые очищают после сеанса, например, те, которые удаляют временные файлы.

Интерактивные нелогиновые оболочки

/etc/bashrc

Хотя bash не ~/.bashrcвызывается напрямую, многие файлы вызывают /etc/bashrc. Эта настройка позволяет пользователю, работающему с привилегиями root, устанавливать общесистемные характеристики по умолчанию для нелогиновых командных оболочек.

.bashrc

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

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

Корай Тугай
источник
2

Вся магия на iOS связана только с использованием sourceфайла, куда вы экспортируете переменные окружения.

Например:

Вы можете создать файл так:

export bim=fooo
export bom=bar

Сохраните этот файл как bimbom.envи сделайте source ./bimbom.ev. Вуаля, у тебя есть переменные среды.

Проверьте их с помощью:

echo $bim
Süther
источник
1

Для Bash попробуйте добавить переменные среды в файл, /etc/profileчтобы сделать их доступными для всех пользователей. Не нужно перезагружаться, просто начните новый сеанс терминала.

Раби
источник