Рішення як для командного рядка, так і для програм GUI з одного джерела (працює з Mac OS X v10.10 (Yosemite) та Mac OS X v10.11 (El Capitan))
Припустимо, у вашому ~/.bash_profile
подібному фрагменті є визначення змінних оточуючих :
export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Нам потрібен агент запуску, який запускатиметься при кожному вході та в будь-який час на вимогу, який завантажує ці змінні в сеанс користувача. Також нам знадобиться скрипт оболонки для розбору цих визначень та створення необхідних команд для виконання агентом.
Створіть у каталозі файл із plist
суфіксом (наприклад, названим osx-env-sync.plist
) ~/Library/LaunchAgents/
із наступним вмістом:
<?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>osx-env-sync</string>
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-l</string>
<string>-c</string>
<string>
$HOME/.osx-env-sync.sh
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
-l
параметр тут критичний; це необхідно для виконання сценарію оболонки з оболонкою для входу, щоб~/.bash_profile
в першу чергу було поставлено перед виконанням цього сценарію.
Тепер сценарій оболонки. Створіть його за ~/.osx-env-sync.sh
допомогою наступного вмісту:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Переконайтеся, що сценарій оболонки виконується:
chmod +x ~/.osx-env-sync.sh
Тепер завантажте запуск агента для поточного сеансу:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Re) Запустіть програму GUI та переконайтеся, що він може читати змінні середовища.
Установка зберігається. Він переживе перезавантаження та релогіни.
Після початкового налаштування (що ви тільки що зробили), якщо ви хочете знову відобразити будь-які зміни у вашому ~/.bash_profile
середовищі, повторна launchctl load ...
команда не виконає те, що ви хочете; натомість ви отримаєте попередження на зразок наступного:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Щоб перезапустити змінні середовища, не проходячи процес виходу / входу, виконайте наступне:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Нарешті переконайтеся, що ви перезапустили вже запущені програми (включаючи Terminal.app), щоб повідомити про зміни.
Тут же я підштовхнув код і пояснення до проекту GitHub: osx-env-sync .
Я сподіваюся, що це стане остаточним рішенням, принаймні для останніх версій OS X (Yosemite & El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
запустити додаток GUI з новим набором системного середовища.