Вопрос

Обновить:Ссылка ниже у него нет полного ответа.Необходимость устанавливать путь или переменную в двух местах (одно для 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 &lt; ~/.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.

держи:

https://www.macupdate.com/app/mac/14617/rcenvironment

Вы можете почитать о 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 для получения разрешений на запись.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top