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

782

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

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

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

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

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

  • 0
    env "switch.1.disabled=true" open -n /Applications/Eclipse.app/ для запуска приложения с графическим интерфейсом в новой установленной системной среде.
  • 0
    Смотрите также: stackoverflow.com/questions/25385934/…
Теги:
macos
path
environment-variables

29 ответов

581

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

Обратите внимание, что среда.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 и других приложениях GUI, которые вы запускаете через Spotlight.

  • 0
    Значит, ты говоришь, что правильный ответ не так? У меня не было никакого успеха с environment.plist.
  • 3
    Я говорю, что принятый ответ (environment.plist) не был успешным для меня. Я успешно использовал подход launchd.conf на 10.5 и 10.6 на четырех машинах.
Показать ещё 22 комментария
230

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

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

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.

  • 1
    Очень хороший! Преимущество использования environment.plist, однако, заключается в том, что OS X соблюдает содержимое этих файлов без необходимости запуска терминала в первую очередь. Во всяком случае, я думаю, что ваш ответ в основном сосредоточен на том, чтобы избежать необходимости перезагрузки, так что спасибо за это.
  • 1
    @kapuzineralex Да, это предотвращает перезагрузку, а также изменяет среду для программ, запущенных из Spotlight, чего не делает environment.plist .
Показать ещё 11 комментариев
102

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

~/.MacOSX/environment.plist

Видеть:

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

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

  • 4
    Это только если вы действительно ожидаете, что они будут использоваться графическими приложениями. Поскольку они обычно не используют переменные окружения, их не очень удобно устанавливать.
  • 17
    Есть несколько очень хороших примеров графических приложений, которые используют переменные среды. Например, IntelliJ любит видеть M2_HOME, чтобы знать, где живет Maven. Чтобы увидеть переменную, вам нужно установить ее в /etc/launchd.conf вместо environment.plist.
Показать ещё 7 комментариев
58

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

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

Создайте файл с суффиксом 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 параметр здесь критический; необходимо выполнить оболочку script с оболочкой входа, чтобы ~/.bash_profile был получен в первую очередь до того, как этот script будет выполнен.

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

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

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

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), чтобы сообщить им об изменениях.

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

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

  • 0
    Работает красиво. Немного беспокоюсь, если это станет популярным, если это будет лазейка в безопасности
  • 1
    Это единственное решение, которое я смог заставить работать должным образом. Великолепные решения. Я не могу понять, почему это должно быть так сложно на Mac ...
Показать ещё 5 комментариев
48

1.

vim ~/.bash_profile

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

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

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile
  • 0
    +1 export - это то, что я собирался предложить, так как BASH не поддерживает setenv
  • 0
    У вас есть опечатка, выше должно сказать ~ / .bash_profile.
Показать ещё 1 комментарий
35

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

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

Другой, бесплатный, с открытым исходным кодом, 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, он также публикует ваши немедленно меняются в окружающую среду, без необходимости выходить из системы и обратно.
< & СНИП GT;
EnvPane включает (и автоматически устанавливает) запускающий агент, который запускает 1) в начале после входа в систему и 2) всякий раз, когда ~/.MacOSX/environment.plist изменяется. Агент читает ~/.MacOSX/environment.plist и экспортирует переменные окружения из этот файл для текущего экземпляра запуска пользователя через тот же API, что используется startctl setenv и launchctl unsetenv.

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

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

  • 2
    EnvPane не может установить PATH в данный момент. Для получения дополнительной информации см. Мой отчет об ошибке: github.com/hschmidt/EnvPane/issues/5
  • 0
    Я ️ ️ это вещь ... Единственный недостаток ... который я думаю, что ЛЮБОЕ решение будет жертвой ... это - необходимость перезапустить процесс - чтобы унаследовать новую "среду". Вонк Вонк.
Показать ещё 2 комментария
17

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

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

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

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

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

Изображение 3881

и добавлена ​​новая пара ключей /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)

Изображение 3882

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

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

  • 3
    Это решение соответствует стандарту наименее навязчивых в системе. Благодарю.
  • 0
    @ Джон Вэнс +1 Полностью согласен, общесистемные изменения всегда рискованны, как ясно объясняет Джейсон Т. Миллер в своем ответе
Показать ещё 1 комментарий
16

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

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

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

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

15

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

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

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

  • 5
    Все приложения, запущенные из Spotlight или любым другим способом, читают /etc/launchd.conf своим родительским процессом, что делает этот выбор привлекательным для установки переменных среды, видимых во всех приложениях и оболочках.
  • 1
    Смотрите мой ответ для другого решения, которое избегает перезагрузки - stackoverflow.com/questions/135688/…
Показать ещё 1 комментарий
13

Обновление (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 vari-                            и ничего не по соображениям безопасности.

  

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

  • 0
    У меня это тоже работает. sudo launchctl procinfo <gui-pid> показывает недавно установленную среду PATH . Но sudo launchctl config user path <new path> фактически установлен для всех пользователей ... (подтверждается добавлением нового пользователя и использованием консоли Python Sublime Text)
  • 1
    Это, похоже, не влияет на переменную среды PATH приложений, которые открываются при входе в систему (которые были открыты при завершении работы).
Показать ещё 5 комментариев
13

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

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

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

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

eval $(launchctl export)
  • 2
    Не так неуловимо: RCenvironment
  • 0
    Хороший совет по экспорту launchctl. Но я бы не стал помещать это как есть в .profile. Он заменит ваш $ PATH на тот, который не содержит / usr / local / bin. Но вы можете использовать регулярное выражение для выбора интересующих вас переменных: `` eval $ (launchctl export | grep '^ my. * =').
Показать ещё 1 комментарий
10

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

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

    source .bashrc
    
  • У моего .bashrc есть следующее:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
    
  • Вышеупомянутый будет перегружать 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
    
  • Таким образом, мне не нужно отправлять каждую переменную в launchctctl каждый раз, и я могу просто настроить мой .bash_profile/.bashrc так, как я хочу. Откройте окно терминала, проверьте переменные среды, которые вас интересуют, с помощью launchctl getenv myVar, измените что-то в своем .bash_profile/.bashrc, закройте окно терминала и снова откройте его, снова проверьте переменную с помощью launchctl и voilá, он изменился.

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

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

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

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

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

  • Введите свой пароль при появлении запроса.

  • Перейдите в конец файла и введите путь, который хотите добавить.
  • Хит-контроль-х для выхода.
  • Введите "Y", чтобы сохранить измененный буфер.
  • Откройте новое окно терминала и введите:

    echo $PATH

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

Я получил эти данные из этого сообщения:

http://architectryan.com/2012/10/02/add-to-the-path-on-mac-os-x-mountain-lion/#.UkED3rxPp3Q

Я надеюсь, что это может помочь кому-то еще

10

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

8

Я думаю, что OP ищет простое, похожее на Windows решение.

Ну вот:

http://www.apple.com/downloads/macosx/system_disk_utilities/environmentvariablepreferencepane.html

  • 2
    Все еще доступно в RCenvironment
7

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

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

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

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

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"
5

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

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

3

Это просто:

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

$vim ~/.profile

В файле put:

MY_ENV_VAR = значение

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

  • Перезагрузите терминал (закройте и снова откройте его)

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

$echo $MY_ENV_VAR

$value


3

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

Откройте программу терминала (это по умолчанию используется в папке Applications/Utilites). Выполните следующую команду коснитесь ~/.bash_profile; открыть ~/.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

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

3

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

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

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

2

/etc/launchd.conf не используется в Yosemite, El Capitain или (High) Sierra

На странице launchctl man:

/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 answer, работает для меня (после перезагрузки): приложения, запущенные из Dock или из Spotlight, наследуют переменные среды, которые я установил в ~/Library/LaunchAgents/my.startup.plist. (В моем случае мне нужно было установить LANG, en_US.UTF-8 для плагина Sublime Text.)

2

Корпуса для входа

/etc/profile

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

.bashrc

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

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

2

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

  • Non-Login:.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
#
2

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

2

Ну, я не уверен в /etc/paths и ~/.MacOSX/environment.plist. Они новы.

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

Я не знаю, как часто это происходит с Mac OS X. Я думаю, что различие сработало, когда оконная система запускает все.

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

ln -s .bashrc .bash_profile
1

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

touch .bash_profile

затем

open -a TextEdit.app .bash_profile

добавить

export TOMCAT_HOME=/Library/Tomcat/Home

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

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

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

export MY_VAR=[your value here]

пример с java home:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

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

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню