Переменные среды в Mac OS X - PullRequest
180 голосов
/ 02 марта 2009

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

Not Duplicate of : Установка переменных среды в OS X?


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


EDIT:

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

Ответы [ 8 ]

287 голосов
/ 31 декабря 2010

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

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

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

139 голосов
/ 21 сентября 2010

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

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

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

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

12 голосов
/ 02 декабря 2010

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

вот, пожалуйста,

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

7 голосов
/ 02 марта 2009

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

/etc/profile - системные переменные окружения.

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

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

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

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

5 голосов
/ 02 марта 2009

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

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

3 голосов
/ 05 сентября 2015

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

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

3 голосов
/ 12 апреля 2012

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

export PATH=whatever/you/want:$PATH

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

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

0 голосов
/ 30 ноября 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...