Решение как для командной строки, так и для приложений с графическим интерфейсом из одного источника (работает с Yosemite & 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"
Нам нужен Launch Agent , который будет запускаться при каждом входе в систему и в любое время по требованию, который будет загружать эти переменные в пользовательский сеанс. Нам также понадобится сценарий оболочки для анализа этих определений и создания необходимых команд, которые будут выполняться агентом.
Создайте файл с суффиксом 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
параметр является критическим здесь; это необходимо для выполнения сценария оболочки с login shell , чтобы ~/.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
(Пере) Запустите приложение с графическим интерфейсом и убедитесь, что оно может читать переменные среды.
Настройка постоянна. Он выживет, перезапустится и войдет в игру.
После первоначальной настройки (которую вы только что сделали), если вы хотите снова отразить какие-либо изменения в вашем ~/.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).