Есть несколько мест, где вы можете установить переменные окружения.
~/.profile
: используйте это для переменных, которые вы хотите установить во всех программах, запускаемых из терминала (обратите внимание, что, в отличие от Linux, все оболочки, открытые в Terminal.app, являются оболочками входа в систему).
~/.bashrc
: это вызывается для оболочек, которые не являются оболочками входа в систему. Используйте это для псевдонимов и других вещей, которые должны быть переопределены в подоболочках, а не для переменных среды, которые наследуются.
/etc/profile
: загружается до ~ / .profile, но в остальном эквивалентно. Используйте его, когда хотите, чтобы переменная применялась к терминальным программам, запускаемым всеми пользователями на машине (при условии, что они используют bash).
~/.MacOSX/environment.plist
: это читается в loginwindow при входе в систему. Это относится ко всем приложениям, включая приложения с графическим интерфейсом, кроме тех, которые запущены 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 < ~/.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"
.
Также обратите внимание, что другие программы, которые запускаются при входе в систему, могут выполняться до запуска агента, и, следовательно, могут не видеть переменные среды, которые он устанавливает.