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



Answers

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

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

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

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

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 .

Question

Каков правильный способ изменения переменных среды, таких как PATH в OSX? Я немного искал Google и нашел 3 разных файла для редактирования:

  • / и т.д. / дорожки
  • ~ / .profile
  • ~ / .tcshrc

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

Изменить: я запускаю OS X 10.5







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

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

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

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

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

sudo launchctl config user path <new path>

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

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

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

[...]

дорожка

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

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

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




В Mountain Lion все пути /etc/paths и /etc/launchd.conf не имеют никакого эффекта!

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

«Измените 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: Конечно, вам нужно настроить запись «Путь» в соответствии с вашими конкретными потребностями.




For Bash, try adding your environment variables to the file /etc/profile to make them available for all users. No need to reboot, just start a new Terminal session.







There are two type of shells at play here.

  • Non-Login: .bashrc is reloaded every time you start a new copy of bash
  • Login: The .profile is loaded only when you either login, or explicitly tell bash to load it and use it as a login shell.

Its important to understand here that with bash .bashrc is only read by a shell that's both interactive and non-login, and you will find that people often load .bashrc in .bash_profile to overcome this limitation.

Now that you have the basic understanding, lets move on to how i would advice you to set it up.

  • .profile: create it non-existing. Put your PATH setup in there.
  • .bashrc: create if non-existing. Put all your Aliases and Custom method in there.
  • .bash_profile: create if non-existing. Put the following in there.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#



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

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

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

(Re) Запустите приложение GUI и убедитесь, что он может читать переменные среды.

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

После первоначальной настройки (что вы только что сделали), если вы хотите снова отразить любые изменения в ~/.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), чтобы информировать их об изменениях.

Я также osx-env-sync код и объяснения в проект GitHub: osx-env-sync .

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




Setup your PATH environment variable on Mac OS

Open the Terminal program (this is in your Applications/Utilites folder by default). Run the following command touch ~/.bash_profile; open ~/.bash_profile This will open the file in the your default text editor.

For ANDROID SDK as example :

You need to add the path to your Android SDK platform-tools and tools directory. In my example I will use "/Development/android-sdk-macosx" as the directory the SDK is installed in. Add the following line:

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

Save the file and quit the text editor. Execute your .bash_profile to update your PATH.

source ~/.bash_profile

Now everytime you open the Terminal program you PATH will included the Android SDK.




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

  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 с помощью launchctll, используете ли вы любое из следующего:

    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. Таким образом, я не должен каждый раз отправлять каждую переменную в launchctctl, и я могу просто настроить мой .bash_profile / .bashrc так, как я хочу. Откройте окно терминала, проверьте переменные среды, которые вас интересуют, с помощью launchctl getenv myVar , измените что-то в своем .bash_profile / .bashrc, закройте окно терминала и снова откройте его, снова проверьте переменную с помощью launchctl и voilá, он изменился.

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




Just did this really easy and quick. First create a ~/.bash_profile from terminal:

touch .bash_profile

тогда

open -a TextEdit.app .bash_profile

Добавить

export TOMCAT_HOME=/Library/Tomcat/Home

save documement and you are done.




well, I'm unsure about /etc/paths and ~/.MacOSX/environment.plist those are new.

But with bash, you should know that .bashrc is executed with every new shell invocation and .bash_profile is only executed once at startup. Don't know how often this is with macos, I think the distinction has broken down with the window system launching everything.

Personally, I eliminate the confusion by creating a .bashrc with everything I need and then do:

ln -s .bashrc .bash_profile



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

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

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

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

Детали:

Элемент входа: ~/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 ) в отдельный скрипт.




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

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

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




Links