Решение как для командной строки, так и для приложений с графическим интерфейсом из одного источника (работает с Mac OS X 10.10 (Yosemite) и Mac OS X 10.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
суффиксом (например, named 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
(Пере) Запустите приложение с графическим интерфейсом и убедитесь, что оно может читать переменные среды.
Настройка постоянна. Он выживет, перезапустится и войдет.
После первоначальной настройки (которую вы только что сделали), если вы хотите снова отразить какие-либо изменения в ~/.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/
запустить приложение с графическим интерфейсом с новой установленной системной средой.