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

Обновление. Ссылка ниже не содержит полного ответа. Необходимость установить путь или переменную в двух местах (один для графического интерфейса и один для оболочки) является хромым.

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


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


EDIT:

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

Ответ 1

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

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

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

Ответ 2

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

  • ~/.profile: используйте это для переменных, которые вы хотите установить во всех программах, запущенных с терминала (обратите внимание, что, в отличие от Linux, все оболочки, открытые в Terminal.app, являются командами входа в систему).
  • ~/.bashrc: это вызывается для оболочек, которые не являются командами входа. Используйте это для псевдонимов и других вещей, которые необходимо переопределить в подоболочках, а не для наследуемых переменных окружения.
  • /etc/profile: это загружается до ~/.profile, но в остальном эквивалентно. Используйте его, когда вы хотите, чтобы переменная применима к терминальным программам, запущенным всеми пользователями на машине (при условии, что они используют bash).
  • ~/.MacOSX/environment.plist: это читается loginwindow при входе в систему. Он применяется ко всем приложениям, включая графические интерфейсы, за исключением запущенных Spotlight в 10.5 (не 10.6). Чтобы изменения вступили в силу, вам необходимо снова выйти и войти в систему. Этот файл больше не поддерживается на OS X 10.8.
  • ваш пользовательский экземпляр launchd: это относится ко всем программам, запускаемым пользователем, графическим интерфейсом и CLI. Вы можете вносить изменения в любое время, используя команду setenv в launchctl. Теоретически вы должны быть в состоянии поставить команды setenv в ~/.launchd.conf, а launchd будет читать их автоматически при входе пользователя в систему, но на практике поддержка этого файла никогда не была реализована. Вместо этого вы можете использовать другой механизм для запуска script при входе в систему и иметь этот вызов script launchctl для настройки среды launchd.
  • /etc/launchd.conf: это считывается при запуске системы при запуске системы и при входе пользователя в систему. Они влияют на каждый процесс в системе, потому что launchd является корневым процессом. Чтобы применить изменения к запущенному корневому запуску, вы можете передать команды в sudo launchctl.

Основные вещи для понимания:

  • переменные окружения наследуются дочерними процессами в момент их раздвоения.
  • Основной процесс - это экземпляр launchd, а также отдельный экземпляр запуска для каждого сеанса пользователя.
  • launchd позволяет изменять текущие переменные среды с помощью launchctl; обновленные переменные затем унаследованы всеми новыми процессами, с которых он развивается.

Пример установки переменной среды с помощью запуска:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Теперь запустите графическое приложение, использующее эту переменную, и voila!

Чтобы обойти тот факт, что ~/.launchd.conf не работает, вы можете поместить следующий script в ~/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 таким образом вы не сможете установить переменные среды со значениями, содержащими пробелы. Если вам нужно это сделать, вы можете вызвать launchctll следующим образом: launchctl setenv MYVARIABLE "QUOTE THE STRING".

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

Ответ 4

Вы можете прочитать на linux, который довольно близок к тому, что Mac OS X. Или вы можете прочитать на BSD Unix, который немного ближе. По большей части различия между Linux и BSD не значительны.

/etc/profile являются переменными системной среды.

~/.profile являются переменными среды, специфичными для пользователя.

", где я должен установить переменную JAVA_HOME?"

  • Есть ли у вас несколько пользователей? Им все равно? Не могли бы вы повредить другого пользователя, изменив /etc/profile?

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

Ответ 5

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

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

Ответ 6

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

Я также разместил ответ на соответствующий вопрос здесь.

Ответ 7

Просто откройте файл ~/.profile через nano в терминале и введите там:

export PATH=whatever/you/want:$PATH

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

ПОЖАЛУЙСТА, НЕ забывайте добавлять ": $PATH" после того, что /you/want, иначе вы удалите все пути в переменной PATH, которые были там до этого.

Ответ 8

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