Є кілька місць, де можна встановити змінні середовища.
~/.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
: це зчитується при запуску при запуску системи та при вході в систему користувача. Вони впливають на кожен процес у системі, оскільки запуск - це кореневий процес. Щоб застосувати зміни до запущеного кореневого запуску, ви можете передати команди в sudo launchctl
.
Основні речі, які слід зрозуміти:
- змінні середовища успадковуються дітьми процесу під час їх розщеплення.
- кореневий процес є запущеним екземпляром, а також існує окремий екземпляр запуску на сеанс користувача.
- запуск дозволяє змінювати поточні змінні середовища за допомогою
launchctl
; оновлені змінні потім успадковуються усіма новими процесами, з яких він розвивається.
Приклад встановлення змінної середовища із запуском:
echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
Тепер запустіть додаток GUI, який використовує змінну, і voila!
Щоб вирішити те, що ~/.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
, і це буде виконуватися при кожному вході.
Зауважте, що, переносячи таким чином список команд у startctl, ви не зможете встановити змінні середовища зі значеннями, що містять пробіли. Якщо вам потрібно зробити це так, ви можете зателефонувати launchctl наступним чином : launchctl setenv MYVARIABLE "QUOTE THE STRING"
.
Також зауважте, що інші програми, які працюють при вході в систему, можуть виконуватись перед запуском, і, отже, можуть не бачити змінних середовища, які він встановлює.