Переменные среды в Mac OS X

Update: ссылка ниже не имеет полного ответа. Необходимость устанавливать путь или переменную в двух местах (один для GUI и один для shell) хромает.

не дубликат: Настройка переменных среды в OS X?


исходя из фона Windows, где очень легко установить и изменить переменные среды (просто перейдите к свойствам системы > Дополнительно > Переменные среды), кажется, что это не так прямо вперед на Mac OS 10.5. Большинство ссылок говорят, что я должен обновить /etc/profile или ~/.профиль. Эквивалентны ли они системным и пользовательским переменным? Например, где я должен установить свой JAVA_HOME переменной?


изменить:

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

8 ответов


нет необходимости в дублировании. Вы можете установить переменные среды, используемые launchd (и дочерние процессы, т. е. все, что вы начинаете с Spotlight), используя launchctl setenv.

например, если вы хотите отразить свой текущий путь в launchd после его настройки в .bashrc или где:

PATH=whatever:you:want
launchctl setenv PATH $PATH

переменные среды не обновляются автоматически при запуске приложений. Вам нужно будет перезапустить приложения, чтобы получить обновленные переменные среды (хотя вы можете просто установите переменные в своей оболочке, например PATH=whatever:you:want; нет необходимости перезапускать терминал).


есть несколько мест, где вы можете установить переменные среды.

  • ~/.profile: используйте это для переменных, которые вы хотите установить во всех программах, запущенных с терминала (обратите внимание, что, в отличие от Linux, все оболочки открыты в терминале.app являются оболочками входа).
  • ~/.bashrc: такой вызывается для оболочек, которые не являются оболочками для входа. Используйте это для псевдонимов и других вещей, которые необходимо переопределить в подэлементах, а не для переменных среды, которые унаследованный.
  • /etc/profile: это загружается до ~/.профиль, но в остальном эквиваленте. Используйте его, когда вы хотите, чтобы переменная применялась к терминальным программам, запущенным всеми пользователями на машине (при условии, что они используют bash).
  • ~/.MacOSX/environment.plist: это читается loginwindow при входе в систему. Это относится ко всем приложениям, включая GUI, за исключением тех, которые запущены Spotlight в 10.5 (не 10.6). Для вступления изменений в силу требуется выйти из системы и снова войти в систему. Этого файла больше нет поддерживается с OS X 10.8.
  • пользователя launchd экземпляр: это относится ко всем программам, запущенным пользователем, GUI и CLI. Вы можете применить изменения в любое время с помощью на 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

теперь запустите приложение GUI, которое использует переменную, и вуаля!

чтобы обойти тот факт, что ~/.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?

как правило, я предпочитаю не связываться с общесистемными настройками, хотя я единственный пользователь. Я предпочитаю редактировать мои локальные настройки.


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

для приложений, запущенных с терминала, вы также можете редактировать~/.файл профиля.


открой , через nano в терминале и введите там:

export PATH=whatever/you/want:$PATH

Сохраните этот файл (cmd+X и Y). После этого выйдите из системы / войдите снова или просто откройте новую вкладку в терминале и попробуйте использовать новую переменную.

пожалуйста, не забудьте добавить": $PATH " после того, что / вы / хотите, иначе вы сотрете все пути в переменной PATH, которые были там до этого.


синхронизация переменных среды OS X для приложений командной строки и GUI из одного источника с помощью osx-env-sync.

Я отвечал на вопрос здесь.


Если вы хотите постоянно изменять переменные среды на El Capitan, установите их в /etc/paths. Примечание этот файл доступен только для чтения по умолчанию, так что вам придется chmod для записи.