Переменные среды в Mac OS X
-
03-07-2019 - |
Вопрос
Обновить:Ссылка ниже у него нет полного ответа.Необходимость устанавливать путь или переменную в двух местах (одно для GUI и одно для shell) является неубедительной.
Не дублирует: Настройка переменных окружения в OS X?
Исходя из фона Windows, где очень легко устанавливать и изменять переменные среды (просто перейдите в "Свойства системы"> "Дополнительно"> "Переменные среды"), в Mac OS 10.5 это не кажется таким простым.В большинстве ссылок говорится, что я должен обновить /etc/profile или ~/.profile.Являются ли они эквивалентом Системных переменных и пользовательских переменных?Например, где я должен установить свой JAVA_HOME
переменная?
Редактировать:
Я хочу иметь возможность доступа к переменной из терминала, а также из такого приложения, как Eclipse.Кроме того, я надеюсь, что мне не придется перезагружаться / выходить из системы, чтобы это вступило в силу.
Решение
Нет необходимости в дублировании.Вы можете задать переменные среды, используемые launchd (и дочерними процессами, т.е.все, что вы начинаете с Spotlight), используя launchctl setenv
.
Например, если вы хотите отразить свой текущий путь в launchd после его настройки в .bashrc
или где бы то ни было:
PATH=whatever:you:want
launchctl setenv PATH $PATH
Переменные среды не обновляются автоматически в запущенных приложениях.Вам нужно будет перезапустить приложения, чтобы получить обновленные переменные среды (хотя вы можете просто установить переменные в своей оболочке, например PATH=whatever:you:want
;нет необходимости перезапускать терминал).
Другие советы
Есть несколько мест, где вы можете установить переменные окружения.
~/.profile
:используйте это для переменных, которые вы хотите установить во всех программах, запускаемых с терминала (обратите внимание, что, в отличие от Linux, все оболочки, открытые в Terminal.app, являются оболочками входа).~/.bashrc
:это вызывается для оболочек, которые не являются оболочками входа в систему.Используйте это для псевдонимов и других вещей, которые необходимо переопределить в подоболочках, а не для переменных окружения, которые наследуются./etc/profile
:это загружается перед ~/.profile, но в остальном эквивалентно.Используйте его, если вы хотите, чтобы переменная применялась к терминальным программам, запускаемым всеми пользователями на компьютере (при условии, что они используют bash).~/.MacOSX/environment.plist
:это считывается loginwindow при входе в систему.Это применимо ко всем приложениям, включая приложения с графическим интерфейсом, за исключением тех, которые были запущены Spotlight в версии 10.5 (не 10.6).Для вступления изменений в силу вам необходимо выйти из системы и войти в систему снова.Этот файл больше не поддерживается начиная с OS X 10.8.- имя вашего пользователя
launchd
экземпляр:это относится ко всем программам, запускаемым пользователем, графическому интерфейсу и командной строке.Вы можете внести изменения в любое время, используяsetenv
команда вlaunchctl
. Теоретически, вы должны быть в состоянии поместитьsetenv
команды в~/.launchd.conf
, иlaunchd
читал бы их автоматически, когда пользователь входит в систему, но на практике поддержка этого файла так и не была реализована.Вместо этого вы можете использовать другой механизм для выполнения скрипта при входе в систему и вызвать этот скриптlaunchctl
чтобы настроитьlaunchd
Окружающая среда. /etc/launchd.conf
:это считывается launchd при запуске системы и входе пользователя в систему.Они влияют на каждый отдельный процесс в системе, поскольку launchd является корневым процессом.Чтобы применить изменения к запущенному root launchd, вы можете передать команды вsudo launchctl
.
Фундаментальными вещами, которые необходимо понять, являются:
- переменные среды наследуются дочерними элементами процесса в момент их разветвления.
- корневой процесс - это экземпляр launchd, и существует также отдельный экземпляр launchd для каждого сеанса пользователя.
- launchd позволяет вам изменять его текущие переменные среды с помощью
launchctl
;затем обновленные переменные наследуются всеми новыми процессами, которые с этого момента разветвляются.
Пример установки переменной окружения с помощью launchd:
echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
Теперь запустите ваше приложение с графическим интерфейсом, которое использует переменную, и вуаля!
Обойти тот факт , что ~/.launchd.conf
не работает, вы можете поместить следующий скрипт в ~/Library/LaunchAgents/local.launchd.conf.plist
:
<?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>local.launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl < ~/.launchd.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Тогда вы можете положить setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE
внутри ~/.launchd.conf
, и это будет выполняться при каждом входе в систему.
Обратите внимание, что при передаче списка команд в launchctl таким образом вы не сможете задать переменным среды значения, содержащие пробелы.Если вам нужно это сделать, вы можете вызвать launchctl следующим образом: launchctl setenv MYVARIABLE "QUOTE THE STRING"
.
Также обратите внимание, что другие программы, которые запускаются при входе в систему, могут выполняться до launchagent и, следовательно, могут не видеть переменные среды, которые он устанавливает.
Я думаю, что то, что ищет OP, - это простое решение, похожее на Windows.
держи:
Вы можете почитать о Linux, который довольно близок к тому, что представляет собой Mac OS X.Или вы можете почитать о BSD Unix, которая немного ближе.По большей части, различия между Linux и BSD невелики.
/etc/profile
являются системными переменными окружения.
~/.profile
являются специфичными для пользователя переменными среды.
"где я должен установить свою переменную JAVA_HOME?"
- У вас есть несколько пользователей?Им не все равно?Не могли бы вы сбить с толку какого-нибудь другого пользователя, изменив
/etc/profile
?
Как правило, я предпочитаю не вмешиваться в общесистемные настройки, даже если я единственный пользователь.Я предпочитаю редактировать свои локальные настройки.
Для приложений с графическим интерфейсом вам придется создавать и редактировать ~/.MacOSX/environment.plist
.Более подробная информация здесь.Вам нужно будет выйти из системы, чтобы они вступили в силу.Я не уверен, влияют ли они также на приложения, запускаемые с терминала, но я предполагаю, что повлияют.
Для приложений, запускаемых с терминала, вы также можете отредактировать файл ~/.profile.
Просто открой ~/.profile
файл, через nano
в терминале и введите там :
export PATH=whatever/you/want:$PATH
Сохраните этот файл (cmd+X и Y).После этого, пожалуйста, выйдите из системы еще раз или просто откройте новую вкладку в терминале и попробуйте использовать вашу новую переменную.
ПОЖАЛУЙСТА, НЕ забудьте добавить ":$PATH" после того, что / вы / хотите, иначе вы сотрете все пути в переменной PATH, которые были там до этого.
Синхронизируйте переменные среды OS X для приложений командной строки и графического интерфейса пользователя из одного источника с osx-env-синхронизация.
Я также опубликовал ответ на связанный с этим вопрос здесь.
Если вы хотите постоянно изменять переменные среды в macOS, установите их в /etc/paths
. Примечание, по умолчанию этот файл доступен только для чтения, поэтому вам придется chmod для получения разрешений на запись.