Переменные среды в 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 < ~/.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"
.
Кроме того, обратите внимание, что другие программы, которые запускаются при входе в систему, могут выполняться перед стартовым агентом и, следовательно, могут не отображаться переменные среды, которые он устанавливает.
Ответ 3
Я думаю, что поиск OP - это простое, подобное окну решение.
здесь ya go:
https://www.macupdate.com/app/mac/14617/rcenvironment
Ответ 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.