macos как добавить - Установка переменных среды на OS X




15 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 .

path изменить переменные

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

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

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

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

Я запускаю OS X v10.5 (Leopard).




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




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

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

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

Чтобы решить обе проблемы одновременно, я использую элемент входа (установленный с помощью инструмента «Системные настройки») в моей учетной записи пользователя. Элемент входа - это сценарий 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 ) в отдельный скрипт.




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




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

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

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




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

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

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

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

eval $(launchctl export)



Как и ответ Мэтт Кертис, я установил переменные среды через 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. Опять же, как и другие решения для мира пост-горного льва, для любых новых переменных среды, которые будут доступны для приложений, вам необходимо запустить или повторно запустить их после изменения.







$PATHпеременная также подлежит path_helper, в свою очередь , использует /etc/pathsфайл и файлы в /etc/paths.d.

Более подробное описание можно найти здесь: http://hea-www.harvard.edu/~fine/OSX/path_helper.html




Это просто:

Измените ~ / .profile и поместите переменные следующим образом.

$ vim ~ / .profile

В файле put:

MY_ENV_VAR = значение

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

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

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

$ echo $ MY_ENV_VAR

$ value




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

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

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




Вход в систему

/etc/profile

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

.bash_profile 
.bash_login 
.profile

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

.bash_logout

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

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

/etc/bashrc

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

.bashrc

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

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




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




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

export MY_VAR=[your value here]

пример с java home:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

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

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

source .profile или закрыть / открыть окно терминала.




Все Magic на IOS работает только с sourceфайлом, где вы экспортируете свои ENV-Variables.

Например:

Вы можете создать файл следующим образом:

export bim=fooo
export bom=bar

Сохраните этот файл как bimbom.env, и сделайте source ./bimbom.evVoilá, у вас есть свои ENV-Variables.

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




Related