Установка переменных среды в OS X - PullRequest
826 голосов
/ 26 сентября 2008

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

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

  • / и т.д. / пути
  • ~ / .profile
  • ~ / .tcshrc

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

Я работаю OS X v10.5 (Leopard).

Ответы [ 30 ]

640 голосов
/ 26 февраля 2009

Бруно на верном пути. Я провел обширное исследование, и если вы хотите установить переменные, которые доступны во всех приложениях с графическим интерфейсом, ваш единственный вариант - /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 /115177/ustanovka-peremennyh-sredy-v-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.

253 голосов
/ 21 сентября 2010

Как настроить среду для новых процессов, запускаемых 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:$PATH для bash или 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.

105 голосов
/ 26 сентября 2008

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

~/.MacOSX/environment.plist

См:

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

Для OS X v10.8 (Mountain Lion) и далее вам необходимо использовать launchd и launchctl .

61 голосов
/ 04 сентября 2015

Решение как для командной строки, так и для приложений с графическим интерфейсом из одного источника (работает с Yosemite & 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"

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

Создайте файл с суффиксом plist (например, с именем 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 параметр является критическим здесь; это необходимо для выполнения сценария оболочки с login shell , чтобы ~/.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).

49 голосов
/ 25 ноября 2011

1.

vim ~/.bash_profile

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

2.печатайте это и сохраните файл:

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile
35 голосов
/ 26 марта 2011

Существуют две проблемы, которые необходимо решить при работе с переменные окружения в 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) в отдельный скрипт.

22 голосов
/ 15 января 2013

Другое бесплатное программное обеспечение с открытым исходным кодом для Mac OSX Mountain Lion (10.8). Панель предпочтений / environment.plist - это EnvPane .

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

По заявлению разработчика:

EnvPane - это панель настроек для Mac OS X 10.8 (Mountain Lion), которая позволяет установить переменные среды для всех программ в графическом и терминальные сессии. Мало того, что это восстанавливает поддержку ~ / .MacOSX / environment.plist в Mountain Lion, он также публикует ваши изменения среды немедленно, без необходимости выхода и обратно.

EnvPane включает в себя (и автоматически устанавливает) Агент launchd, который запускается 1) рано после входа в систему и 2) всякий раз, когда Изменения ~ / .MacOSX / environment.plist. Агент читает ~ / .MacOSX / environment.plist и экспортирует переменные среды из этот файл для экземпляра launchd текущего пользователя через тот же API, который используется launchctl setenv и launchctl unsetenv.

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

P.S. Мне нравится название (звучит как «Ends Pain»).

17 голосов
/ 24 января 2013

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

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

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

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

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

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 )

enter image description here

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

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

16 голосов
/ 17 июля 2012

Хотя ответы здесь не являются «неправильными», я добавлю еще одно: никогда не вносите изменения переменных среды в 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.

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

15 голосов
/ 02 октября 2015

Обновление (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:

config system | значение параметра пользователя

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

[...]

путь

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

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

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

...